在Dapper中获取DynamicParameters的内容

时间:2015-07-08 16:28:01

标签: c# reflection dapper

我们正在将数据库从Oracle迁移到MySQL。 Oracle和MySQL对绑定变量@:使用不同的字符。 我们正在使用Dapper来查询数据库。我们将DynamicParameters传递给Dapper,绑定变量可以工作。

我希望能够做的是浏览DynamicParameters并查看值的名称并更改前面的字符,然后在SQL字符串中替换它。我知道我会怎么做。

我遇到的问题是你无法枚举DynamicParameters来获取密钥和值。

我的想法是尝试使用反射在运行时获取私有<string, DynamicParameters.ParamInfo> parameters字段。我无法解决如何使其发挥作用,因为DynamicParameters.ParamInfo是私人课程。

关于我能做什么的任何想法?

1 个答案:

答案 0 :(得分:0)

您有两个问题,第一部分:

  

我希望能够做的是通过DynamicParameters和   查看值的名称并更改前面的字符

,第二个是:

  

然后在SQL字符串中替换它

第一部分让我有兴趣看看Dapper有多聪明。它证明,在DynamicParameters中处理传递给它的参数是足够聪明的。请考虑您有以下内容:

// Source of the DynamicParameters
var args = new Dictionary<string,string>();
args.Add("@emailPromotion", "1");
// additional args goes here

// An example of how you build a DynamicParameters
var dbArgs = new DynamicParameters();
foreach (var pair in args) dbArgs.Add(pair.Key, pair.Value);

// The query - using SQL Server (AdventureWorks)
var sql = "select * from Person.Contact WHERE EmailPromotion = @EmailPromotion";

// The Dapper call (this works as expected)
var items = the_connection.Query<dynamic>(sql, dbArgs);    

现在让我们假设您使用colon从Oracle迁移,并且您从此来源传递了DynamicParameters:

var oracle_args = new Dictionary<string,string>();
oracle_args.Add(":emailPromotion", "1");

如果您将oracle_args与前面给出的其余代码一起使用,它仍然有用。你可能会期望它不会因为SQL Server无法理解冒号。唯一会导致错误的是查询本身(var sql)具有无效字符 - colon

这与您的问题有何关系?这意味着您不必担心&#34; 第一部分&#34;让Dapper完成它的工作。你只需要照顾&#34; 第二部分&#34;并调整您的(sql)查询。如果你完全控制了查询,那么它不应该给你任何问题。一个简单的字符串替换就可以了。