Ich arbeite an einem Projekt, um eine große VB6-Anwendung in .NET zu konvertieren. Ich beschloss, ein Projekt zu erstellen, um eine Fassade für den vorhandenen VB6-ADO-Code bereitzustellen, wobei ich die erstaunlichen Dapper-Erweiterungsmethoden verwende, um den gesamten Datenbankcode zu verarbeiten, den die VB6-ADO-Funktionen verwenden.
Eine der Funktionen, die ich in meinem neuen Projekt unterstützen muss, ist die Möglichkeit, die XML-String-Ergebnisse von gespeicherten T-SQL-Prozeduren zu erhalten (über FOR XML). Dapper hat keine Unterstützung, um dieses XML, das ich sehen kann, zurückzugeben. Also habe ich die ADO.NET ExecuteXmlReader
Methode implementiert, um diese Rückgabe bereitzustellen. Mein Projekt verwendet auch Dapper DynamicParameters
, um alle für die gespeicherten Prozeduren erforderlichen In / Out-Parameter zu erfassen.
Was ich nicht sehen kann, ist, wie die DynamicParameters
in die SqlCommand.SqlParameterCollection
werden, damit ich diese Parameter in das SqlCommand
Objekt für die ExecuteXmlReader
Methode ExecuteXmlReader
kann. Ich muss auch für dieses Szenario Ausgabeparameter unterstützen.
Ich kann über die DynamicParameters
iterieren, aber das bringt mir nur den Parameternamen und den Wert. Ich brauche auch die Richtung, Art, Größe, Maßstab und Präzision. Dapper verfügt über eine DynamicParameters.ReplaceLiterals
Methode, die ein IDbCommand
Objekt zum Ersetzen von Literalen in SQL-Zeichenfolge verwendet. Ich wünschte, es hätte eine Methode, um auch die Parameter einzugeben.
Fehle ich etwas Offensichtliches hier? Wenn ich die Dapper Execute
Methode DyanmicParameters
, kann ich die DyanmicParameters
direkt an diese Methode übergeben. Ich sehe nur nicht, wie sie an das SqlCommand
Objekt übergeben werden.
Nach dem Testen sehe ich, dass Dapper tatsächlich das Ziehen von XML aus gespeicherten Prozeduren unterstützt.
var result = conn.Query<string>(@"select * from <someTable> for xml auto");
Dadurch wird ein Array mit einer Zeichenfolge zurückgegeben, wobei jedes Element bis zu 2.033 Zeichen enthält, die Sie einfach verbinden können, um das Ergebnis als einzelne Zeichenfolge zu erhalten.
var fullResult = string.Join("", result);
oder
var fullResult = string.Concat(result);
oder alles in einem Schritt:
var result = string.Concat(conn.Query<string>(
@"select * from <someTable> for xml auto", buffered: false));
Daher muss ich die ExcuteXmlReader-Methode nicht selbst implementieren, und jetzt kann Dapper die Parameter normal verarbeiten.