获取Dapper中DynamicParameters的内容



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

我想要做的是通过DynamicParameters并查看值的名称并更改前面的字符,然后将其替换为SQL字符串。我知道该怎么做。

我遇到的问题是你不能枚举DynamicParameters来获得键和值。

我的想法是尝试在运行时使用反射获得私有<string, DynamicParameters.ParamInfo> parameters字段。我不知道如何使它工作,因为DynamicParameters.ParamInfo是一个私有类。

我能做些什么吗?

你的问题有两个部分,第一:

我想要做的是通过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);    

现在让我们假设你从Oracle使用colon迁移,你从这个源传递你的DynamicParameters:

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

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

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

相关内容

  • 没有找到相关文章

最新更新