Ottenere il contenuto di DynamicParameters in Dapper

c# dapper reflection

Domanda

Stiamo migrando database da Oracle a MySQL. Oracle e MySQL utilizzano un carattere diverso per le variabili bind @ e : Stiamo usando Dapper per interrogare il database. Passiamo in DynamicParameters in Dapper e le variabili di binding funzionano.

Quello che voglio essere in grado di fare è passare attraverso i DynamicParameters e osservare il nome del valore e modificare il carattere sul lato anteriore e quindi sostituirlo anche nella stringa SQL. So come lo farei.

Il problema che ho è che non è possibile enumerare i DynamicParameters per ottenere la chiave e il valore.

Le mie idee sono di provare a ottenere il <string, DynamicParameters.ParamInfo> parameters privato <string, DynamicParameters.ParamInfo> parameters in fase di runtime usando reflection. Non riesco a capire come farlo funzionare come DynamicParameters.ParamInfo è una classe privata.

Qualche idea su cosa potrei fare?

Risposta accettata

Ci sono due parti per la domanda, prima:

Quello che voglio essere in grado di fare è passare attraverso i DynamicParameters e guardare il nome del valore e cambiare il carattere sul davanti

e il secondo è:

quindi sostituirlo anche nella stringa SQL

La prima parte mi ha interessato a vedere quanto sia intelligente Dapper. Dimostra che è, abbastanza intelligente, per gestire gli argomenti passati ad esso in DynamicParameters . Considera di avere il seguente:

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

Ora diciamo che sei migrato da Oracle usando colon e hai passato i tuoi DynamicParameters da questa fonte:

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

Se usi questo oracle_args con il resto del codice dato in precedenza funzionerà ancora. Ci si aspetterebbe che non sarà come SQL Server non è in grado di capire i due punti. L'unica cosa che causerà un errore è se la query stessa ( var sql ) ha il carattere non valido - i colon .

Come si riferisce alla tua domanda? Ciò significa che non devi preoccuparti della " prima parte " e lasciare che Dapper faccia il suo lavoro. Devi solo occuparti della " seconda parte " e aggiustare le tue query (sql). E se hai il controllo totale delle domande allora non dovrebbe darti alcun problema. Una semplice sostituzione di stringa avrebbe fatto il trucco.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché