oracle 字段 as,对oracle的特殊字段类型提供支持

针对Oracle大字段(clob和blob)目前实测,有如下两种方法:

[A] 使用RequestContext.Request进行提交,可以无视参数类型设置,测试代码如下:

[Fact]

public void Test2()

{

var content = _sql.ExecuteScalar(new RequestContext()

{

RealSql = "select flowdefine from flows where flowid = 21"

});

content += content + content + content;

_testOutputHelper.WriteLine(content.Length.ToString());

var t = _sql.Execute(new RequestContext()

{

RealSql = "update flows set flowdefine = :flowdefine where flowid = 21",

Request = new

{

flowdefine= content

}

});

_testOutputHelper.WriteLine(t.ToString());

}

[B] 使用RequestContext.Parameters进行提交,代码无法运行,测试代码如下:

[Fact]

public void Test3()

{

var content = _sql.ExecuteScalar(new RequestContext()

{

RealSql = "select flowdefine from flows where flowid = 21"

});

content += " ";

_testOutputHelper.WriteLine(content.Length.ToString());

var t = _sql.Execute(new RequestContext()

{

RealSql = "update flows set flowdefine = :flowdefine where flowid = 21",

Parameters = new SqlParameterCollection()

{

new SqlParameter("flowdefine", content)

}

});

_testOutputHelper.WriteLine(t.ToString());

}

引发的异常如下:

Oracle.ManagedDataAccess.Client.OracleException : ORA-01008: 并非所有变量都已绑定

at OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, SqlStatementType sqlStatementType, Int32 arrayBindCount, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)

at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, OracleConnection connection, OracleLogicalTransaction& oracleLogicalTransaction, Boolean isFromEF)

at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()

at SmartSql.Command.CommandExecuter.<>c__DisplayClass10_0.b__0()

at SmartSql.Command.CommandExecuter.ExecuteWrap[TResult](Func`1 executeImpl, ExecutionContext executionContext, String operation)

和开发团队中的正超沟通后,发现是在RequestContext中的方法SetupParameters里,

对Parameters 做了覆盖,导致外部设置值无效。原始代码如下:

public override void SetupParameters()

{

Parameters = SqlParameterCollection.Create(Request,

ExecutionContext.SmartSqlConfig.Settings.IgnoreParameterCase);

}

修改为如下代码后,可正常工作:

public override void SetupParameters()

{

if (Parameters == null)

Parameters = SqlParameterCollection.Create(Request,

ExecutionContext.SmartSqlConfig.Settings.IgnoreParameterCase);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值