我们正在将数据库从Oracle迁移到MySQL。
Oracle和MySQL对绑定变量@
和:
使用不同的字符。
我们正在使用Dapper来查询数据库。我们将DynamicParameters传递给Dapper,绑定变量可以工作。
我希望能够做的是浏览DynamicParameters并查看值的名称并更改前面的字符,然后在SQL字符串中替换它。我知道我会怎么做。
我遇到的问题是你无法枚举DynamicParameters来获取密钥和值。
我的想法是尝试使用反射在运行时获取私有<string, DynamicParameters.ParamInfo> parameters
字段。我无法解决如何使其发挥作用,因为DynamicParameters.ParamInfo
是私人课程。
关于我能做什么的任何想法?
答案 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)查询。如果你完全控制了查询,那么它不应该给你任何问题。一个简单的字符串替换就可以了。