Closed gmij closed 4 years ago
针对Oracle大字段(clob和blob)目前实测,有如下两种方法:
[A] 使用RequestContext.Request进行提交,可以无视参数类型设置,测试代码如下:
[Fact]
public void Test2()
{
var content = _sql.ExecuteScalar<string>(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<string>(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.
和开发团队中的正超沟通后,发现是在RequestContext
public override void SetupParameters()
{
Parameters = SqlParameterCollection.Create<TRequest>(Request,
ExecutionContext.SmartSqlConfig.Settings.IgnoreParameterCase);
}
修改为如下代码后,可正常工作:
public override void SetupParameters()
{
if (Parameters == null)
Parameters = SqlParameterCollection.Create<TRequest>(Request,
ExecutionContext.SmartSqlConfig.Settings.IgnoreParameterCase);
}
关于调用Oracle存储过程返回记录集的问题,目前,实测,可以调用的代码如下,希望虎哥能提供更完善的解决方案:
[Fact]
public void Test4()
{
var context = new RequestContext()
{
RealSql = "TREEDATATABLE.GET_ORGANISE",
CommandType = CommandType.StoredProcedure,
Parameters = new SqlParameterCollection(true)
{
new SqlParameter("VALLID", ""),
new SqlParameter("VORGID", "0"),
// 用于接收记录集的返回参数,必须要先声明
new SqlParameter("RETURN_LIST", "")
}
};
// 修改RETURN_LIST的参数类型和参数的方向
context.Parameters["RETURN_LIST"].SourceParameter =
new OracleParameter("RETURN_LIST",
OracleDbType.RefCursor, ParameterDirection.Output);
// 只有设置了上面的这句话,下面的这条语句,才能取得到东西,不然Rows.Count始终是0
var ds = _sql.GetDataSet(context).Tables[0];
_testOutputHelper.WriteLine(ds.Rows.Count.ToString());
}
参考资料:Oracle官方使用存储过程返回记录集
1 . 使用 TypeHandler 即可。
ORA-01008: 并非所有变量都已绑定 该问题请引入:
Install-Package SmartSql.Oracle
new SmartSqlBuilder().
UseOracleCommandExecuter()
SmartSql.Oracle 这个包, 已经引入过了。
4.1.46版本中,已解决。
can it suport type 'object'?/ 可以兼容数据库自定义参数 类型吗?
SmartSql version
last version
Database provider and version
oracle any version oracle core provider
Steps to reproduce
Expected result
Actual result
Stack trace