获取Dapper中DynamicParameters的内容
Getting the content of DynamicParameters in Dapper
我们正在将数据库从 Oracle 迁移到 MySQL。
Oracle 和 MySQL 对绑定变量 @
和 :
使用不同的字符。
我们正在使用 Dapper 来查询数据库。我们将 DynamicParameters 传递给 Dapper 并且绑定变量起作用。
我想要做的是通过 DynamicParameters 并查看值的名称并更改前面的字符,然后将其替换为 SQL 字符串。我知道我会怎么做。
我遇到的问题是您无法枚举 DynamicParameters 来获取键和值。
我的想法是尝试使用反射在运行时获取私有 <string, DynamicParameters.ParamInfo> parameters
字段。我不知道如何让它工作,因为 DynamicParameters.ParamInfo
是私有的 class。
对我能做什么有什么想法吗?
你的问题分为两部分,第一:
What I want to be able to do is go through the DynamicParameters and
look at the name of the value and change the character on the front
第二个是:
then replace it in the SQL string as well
第一部分让我有兴趣了解 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 服务器无法理解冒号。唯一会导致错误的是查询本身 (var sql
) 具有无效字符 - colon
.
这与您的问题有什么关系? 这意味着您不必担心“第一部分”和让 Dapper 完成它的工作。您只需处理“第二部分”并调整您的 (sql) 查询。如果您可以完全控制查询,那么它应该不会给您带来任何问题。一个简单的字符串替换就可以解决问题。
我们正在将数据库从 Oracle 迁移到 MySQL。
Oracle 和 MySQL 对绑定变量 @
和 :
使用不同的字符。
我们正在使用 Dapper 来查询数据库。我们将 DynamicParameters 传递给 Dapper 并且绑定变量起作用。
我想要做的是通过 DynamicParameters 并查看值的名称并更改前面的字符,然后将其替换为 SQL 字符串。我知道我会怎么做。
我遇到的问题是您无法枚举 DynamicParameters 来获取键和值。
我的想法是尝试使用反射在运行时获取私有 <string, DynamicParameters.ParamInfo> parameters
字段。我不知道如何让它工作,因为 DynamicParameters.ParamInfo
是私有的 class。
对我能做什么有什么想法吗?
你的问题分为两部分,第一:
What I want to be able to do is go through the DynamicParameters and look at the name of the value and change the character on the front
第二个是:
then replace it in the SQL string as well
第一部分让我有兴趣了解 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 服务器无法理解冒号。唯一会导致错误的是查询本身 (var sql
) 具有无效字符 - colon
.
这与您的问题有什么关系? 这意味着您不必担心“第一部分”和让 Dapper 完成它的工作。您只需处理“第二部分”并调整您的 (sql) 查询。如果您可以完全控制查询,那么它应该不会给您带来任何问题。一个简单的字符串替换就可以解决问题。