Получение содержимого DynamicParameters в Dapper

c# dapper reflection

Вопрос

Мы переносим базы данных из Oracle в MySQL. Oracle и MySQL используют другой символ для переменных bind @ и : Мы используем Dapper для запроса базы данных. Мы передаем DynamicParameters в Dapper, и переменные связывания работают.

То, что я хочу сделать, это пройти через DynamicParameters и посмотреть имя значения и изменить символ на передней панели, а затем заменить его также в строке SQL. Я знаю, как я это сделаю.

Проблема заключается в том, что вы не можете перечислять DynamicParameters для получения ключа и значения.

Мои идеи - попытаться завладеть частным полем <string, DynamicParameters.ParamInfo> parameters во время выполнения с использованием отражения. Я не могу понять, как заставить его работать как DynamicParameters.ParamInfo - это частный класс.

Любые идеи о том, что я могу сделать?

Принятый ответ

Есть две части вопроса:

То, что я хочу сделать, это пройти через DynamicParameters и посмотреть имя значения и изменить символ на передней панели

а вторая -

затем замените его также в строке SQL

Первая часть заинтересовала меня, как достаточно умный Даппер. Это доказывает, что достаточно разумно обрабатывать аргументы, переданные ему в 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) запросы. И если у вас есть полный контроль над запросами, он не должен давать вам никаких проблем. Простая замена строки сделала бы трюк.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему