Obtenir le contenu de DynamicParameters dans Dapper

c# dapper reflection

Question

Nous migrons des bases de données Oracle vers MySQL. Oracle et MySQL utilisent un caractère différent pour les variables de liaison @ et : . Nous utilisons Dapper pour interroger la base de données. Nous passons DynamicParameters dans Dapper et les variables de liaison fonctionnent.

Ce que je veux pouvoir faire, c'est parcourir les DynamicParameters et regarder le nom de la valeur et changer le caractère sur le devant, puis le remplacer également dans la chaîne SQL. Je sais comment je ferais ça.

Le problème que j'ai est que vous ne pouvez pas énumérer les paramètres dynamiques pour obtenir la clé et la valeur.

Mes idées sont d'essayer d'obtenir le champ de <string, DynamicParameters.ParamInfo> parameters private <string, DynamicParameters.ParamInfo> parameters à l'exécution en utilisant la réflexion. Je ne peux pas trouver comment le faire fonctionner car DynamicParameters.ParamInfo est une classe privée.

Des idées sur ce que je pourrais faire?

Réponse acceptée

Il y a deux parties à votre question, d'abord:

Ce que je veux pouvoir faire, c'est parcourir les DynamicParameters et regarder le nom de la valeur et changer le caractère au recto

et le second est:

puis remplacez-le également dans la chaîne SQL

La première partie m'a intéressé de voir à quel point Dapper est suffisamment intelligent. Cela prouve que c'est assez intelligent pour gérer les arguments qui lui sont passés dans DynamicParameters . Considérez que vous avez les éléments suivants:

// 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);    

Maintenant, disons que vous avez migré d'Oracle en utilisant colon et que vous avez passé vos DynamicParameters à partir de cette source:

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

Si vous utilisez cette oracle_args avec le reste du code donné plus tôt, cela fonctionnera toujours. Vous vous attendez à ce que SQL Server ne puisse pas comprendre les deux points. La seule chose qui provoque une erreur est si la requête elle-même ( var sql ) a le caractère non valide - les colon - colon .

Comment alors cela se rapporte à votre question? Cela signifie que vous n'avez pas à vous soucier de la " première partie " et laissez Dapper faire son travail. Vous devez juste prendre soin de la " seconde partie " et ajuster vos requêtes (sql). Et si vous avez le contrôle total des requêtes, cela ne devrait vous poser aucun problème. Un simple remplacement de chaîne ferait l'affaire.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi