Jon*_*Jon 7 oracle ado.net dapper
我正在使用dapper来进行一些oracle访问.我有一个场景,我必须有一个类型为OracleDbType.Clob的输出参数.当我使用dapper并因此使用基本DbType枚举时,我正在使用此处建议的DbType.Object枚举http://docs.oracle.com/html/B14164_01/featOraCommand.htm代表OracleDbType.Clob.
但是,这会将命令参数(深入到dapper中)设置为DbType对象和oracle类型Blob(因为DbConnection提供者是具体的OracleParameter).如果此参数的类型为Clob而不是Blob,则此Oracle proc仅会起作用.
纯ADO代码就像一个魅力(使用OracleParameter和OracleConnection等),但似乎没有办法在dapper中设置具体类型或钩子进入这个DbParameter创建过程,以便在返回的CommandParameter上更改此OracleType?
这有效:
using (OracleConnection conn = new OracleConnection("some connection string"))
{
conn.Open();
var cmd = new OracleCommand("ProcName", conn);
cmd.CommandType = CommandType.StoredProcedure;
var paramOne = new OracleParameter("ReturnValue", OracleDbType.Clob, int.MaxValue, null, ParameterDirection.Output);
cmd.Parameters.Add(paramOne);
cmd.ExecuteNonQuery();
var value1 = paramOne.Value;
}
Run Code Online (Sandbox Code Playgroud)
这失败了:
DynamicParameters dyanmicParameters = new DynamicParameters();
dyanmicParameters.Add("ReturnValue", null, DbType.Object, ParameterDirection.Output);
connection.Execute("ProcName", dyanmicParameters, commandType: CommandType.StoredProcedure);
var val = dynamicParameters.Get<object>("ReturnValue");
Run Code Online (Sandbox Code Playgroud)
有任何想法吗??
谢谢,
乔恩
我找到了这个vijaysg/OracleDynamicParameters.cs
它创建了OracleDynamicParameters类实现IDynamicParameters接口.
以下是如何使用它
样品:
PROCEDURE GetUserDetailsForPIDM (i_id IN NUMBER,
o_user OUT SYS_REFCURSOR,
o_roles OUT SYS_REFCURSOR);
Run Code Online (Sandbox Code Playgroud)
以及如何用dapper调用它
public static User GetUserDetailsByID( int ID ) {
User u = null;
using ( OracleConnection cnn = new OracleConnection( ConnectionString ) ) {
cnn.Open( );
var p = new OracleDynamicParameters( );
p.Add( "i_id", ID );
p.Add( "o_user", dbType:OracleDbType.RefCursor, direction: ParameterDirection.Output );
p.Add( "o_roles", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output );
using ( var multi = cnn.QueryMultiple( "PKG_USERS.GetUserDetailsForID", param: p, commandType: CommandType.StoredProcedure ) ) {
u = multi.Read<User>( ).Single( );
u.Roles = multi.Read<UserRole>.ToList( );
}
}
return u;
}
Run Code Online (Sandbox Code Playgroud)
对于Clob类型,只需指定OracleDbType.Clob添加参数的时间.
我知道你很久以前就问过这个问题了。但是,我在不同的数据库类型上遇到了同样的问题。
基本上你遇到了 Dapper 的问题之一。这是一个微观世界,对于事情应该如何运作有些固执己见。它似乎主要是针对 MS SQL Server 编写的,尽管它声称它适用于任何数据库类型。这在很大程度上是正确的,但是当您开始接触更深奥的数据类型(例如 Clob、Blob、地理空间等)时,正如您所看到的,事情开始崩溃。
解决这个问题的唯一方法是创建自定义查询参数。您可以在此处查看ICustomQueryParameter示例源: https: //github.com/SamSaffron/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs
转到这一行:
sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter
Run Code Online (Sandbox Code Playgroud)
您基本上可以编写自己的使用方法OracleDbType.Clob,然后像这样使用它:
Query<Thing>("select * from Thing where Name = @Name", new { Name = new OracleClob { Value = "abcde" } });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3796 次 |
| 最近记录: |