C# 在Dapper中获取DynamicParameters的内容

C# 在Dapper中获取DynamicParameters的内容,c#,reflection,dapper,C#,Reflection,Dapper,我们正在将数据库从Oracle迁移到MySQL。 Oracle和MySQL使用不同的字符作为绑定变量@和:。 我们正在使用Dapper查询数据库。我们将DynamicParameters传入Dapper,绑定变量就可以工作了 我想做的是遍历DynamicParameters,查看值的名称,更改前面的字符,然后在SQL字符串中替换它。我知道我会怎么做 我的问题是,您无法枚举DynamicParameters来获取键和值 我的想法是尝试在运行时使用反射获取私有参数字段。我不知道如何使它作为动态参数工

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

我想做的是遍历DynamicParameters,查看值的名称,更改前面的字符,然后在SQL字符串中替换它。我知道我会怎么做

我的问题是,您无法枚举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_args
与前面给出的其余代码一起使用,它仍然可以工作。您可能认为它不会,因为SQL Server无法理解冒号。唯一会导致错误的是,如果查询本身(
var-sql
)具有无效字符--
冒号


那么这与你的问题有什么关系呢?这意味着你不必担心“第一部分”,让整洁的人来完成它的工作。您只需处理“第二部分”并调整(sql)查询。如果您完全控制查询,那么它不会给您带来任何问题。一个简单的字符串替换就可以了。

没有必要这样做。参数名称不应包含DBMS特定的前缀字符,例如,使用
emailPromotion
,而不是
@emailPromotion
。您所说的内容已经在我的帖子中,实际上不需要担心-在参数中是否包含它。问题是查询字符串中的参数。如果不放置绑定字符,那么sql将无法理解它——这同样是针对查询的,而不是针对参数的。
var oracle_args = new Dictionary<string,string>();
oracle_args.Add(":emailPromotion", "1");