针对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);
}