Abrufen des Inhalts von DynamicParameters in Dapper

c# dapper reflection

Frage

Wir migrieren Datenbanken von Oracle nach MySQL. Oracle und MySQL verwenden für die Bind-Variablen @ und : ein anderes Zeichen. Wir verwenden Dapper, um die Datenbank abzufragen. Wir übergeben DynamicParameters in Dapper und die Bindevariablen arbeiten.

Was ich tun möchte, ist durch die DynamicParameters zu gehen und den Namen des Wertes zu betrachten und das Zeichen auf der Vorderseite zu ändern und es dann auch in der SQL-Zeichenfolge zu ersetzen. Ich weiß, wie ich das machen würde.

Das Problem, das ich habe, ist, dass Sie die DynamicParameters nicht aufzählen können, um den Schlüssel und den Wert zu erhalten.

Meine Ideen bestehen darin, zu versuchen, das private <string, DynamicParameters.ParamInfo> parameters zur Laufzeit durch Reflektion zu erhalten. Ich kann nicht herausfinden, wie es funktioniert wie DynamicParameters.ParamInfo ist eine private Klasse.

Irgendwelche Ideen, was ich tun könnte?

Akzeptierte Antwort

Es gibt zwei Fragen an Sie zuerst:

Was ich tun möchte, ist durch die DynamicParameters zu gehen und den Namen des Wertes zu betrachten und das Zeichen auf der Vorderseite zu ändern

und das zweite ist:

dann ersetze es auch in der SQL-Zeichenfolge

Der erste Teil hat mich interessiert, wie schlau genug Dapper ist. Es beweist, dass es klug genug ist, die in DynamicParameters Argumente zu DynamicParameters . Überlegen Sie, Sie haben folgendes:

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

Nehmen wir an, Sie migrierten mit einem colon von Oracle und übermittelten Ihre DynamicParameters von dieser Quelle:

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

Wenn Sie diese oracle_args mit dem Rest des zuvor angegebenen Codes verwenden, oracle_args es weiterhin. Sie würden erwarten, dass SQL Server den Doppelpunkt nicht versteht. Das einzige, was zu einem Fehler führt, ist, wenn die Abfrage selbst ( var sql ) das ungültige Zeichen hat - den colon .

Wie verhält es sich dann mit deiner Frage? Dies bedeutet, dass Sie sich nicht um den " ersten Teil " kümmern müssen und Dapper seine Arbeit machen muss. Sie müssen sich nur um den " zweiten Teil " kümmern und Ihre (SQL-) Abfragen anpassen. Und wenn Sie die volle Kontrolle über die Abfragen haben, sollte es Ihnen kein Problem geben. Ein einfacher String Replace würde den Trick machen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum