gpt4 book ai didi

oracle - Dapper with Oracle 传入 DbParameter

转载 作者:行者123 更新时间:2023-12-04 02:55:26 27 4
gpt4 key购买 nike

我正在使用 Oracle 试用 Dapper,我试图运行多结果集查询,但 Oracle 需要 dbtype 的 refcursor。

StringBuilder query = new StringBuilder("BEGIN ");
query.Append("OPEN :rs1 FOR SELECT * FROM Table1 where key=:KEY; ");
query.Append("OPEN :rs2 FOR SELECT * FROM Table2 where key=:KEY; ");
query.Append("END;");
  • 有没有办法将 OracleParameter(可能作为 DbParameter?)传递给 Dapper?当我尝试时,它抛出了一个错误。

  • 使用 DynamicParameter 与使用 DbParameter(假设类型已知等)相比有什么优势?

最佳答案

  1. 在最新版本中添加了一个新界面,允许对参数进行更多控制 - 添加它是为了支持 SQL Server 中的 TVP,但应该适用于这种情况。但是,我也很乐意为任何看起来像 dbparameter 的类型添加特殊的外壳 - 并直接添加它们,这样您就可以直接添加 oracleparameter。

  2. DynamicParameters 是关于要添加的多少 参数,因此它与值与 DbParameter 的讨论有点正交。目前,代码通常更喜欢自己控制添加参数,因此调用者只知道“一个名为 id 且值为 7 的 int”——而不是任何 ado.net 详细信息。但它可以做到。


编辑:如果您真的想要使用参数列表(即 List<DbParameter> 等),那么您可以使用类似的东西来做到这一点:

public class DbParams : Dapper.SqlMapper.IDynamicParameters,
IEnumerable<IDbDataParameter>
{
private readonly List<IDbDataParameter> parameters =
new List<IDbDataParameter>();
public IEnumerator<IDbDataParameter> GetEnumerator() {
return parameters.GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
public void Add(IDbDataParameter value)
{
parameters.Add(value);
}
void Dapper.SqlMapper.IDynamicParameters.AddParameters(IDbCommand command,
Dapper.SqlMapper.Identity identity)
{
foreach (IDbDataParameter parameter in parameters)
command.Parameters.Add(parameter);
}
}

用法如下:

public void TestCustomParameters()
{
var args = new DbParams {
new SqlParameter("foo", 123),
new SqlParameter("bar", "abc")
};
var result = connection.Query("select Foo=@foo, Bar=@bar", args).Single();
int foo = result.Foo;
string bar = result.Bar;
foo.IsEqualTo(123);
bar.IsEqualTo("abc");
}

哪个通过了测试。

但是,我必须强调,我宁愿不要用数据库参数知识来阻碍调用代码,除非它真的真的需要知道;我更喜欢:

var args = new {
foo = 123, bar = "abc"
};

它做完全同样的事情,但没有掉落到 ADO.NET;如果您使用“修饰的”ADO.NET 连接(例如,迷你分析器),这一点尤其重要 - 在这种情况下,您获得的层不是 OracleCommand/OracleConnection等 - 它是抽象的。这意味着强行添加一个OracleParameter 可能并不总是有效 - 但添加名称为 "foo" 的参数和值(value)123 - 这非常可靠。

关于oracle - Dapper with Oracle 传入 DbParameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com