Eine der Sachen, die ich dapper verwendet habe, besteht darin, XML-Daten, die aus unserer Datenbank stammen, in Strings umzuwandeln und sie dann innerhalb des gegebenen Objekts so zu deserialisieren, wie ich es brauche.
Ich bin heute auf etwas gestoßen, bei dem Dapper eine Liste von Strings zurückgegeben hat, die das XML nur enthielt, wenn es aufgeteilt wurde. Ist das beabsichtigt? Sollte ich das programmieren, wenn ich eine einzelne XML-Zeichenkette erwartet?
Hier ist, wie ich den Prozess aufrufen und wenn Sie den Prozess ausführen, gibt es ein einzelnes Ergebnis mit XML-Daten zurück, aber Dapper gibt 2 Zeichenfolgen im Ergebnis zurück. Wenn ich sie verkette, dann komme ich zurück, was ich erwarte, aber das scheint nicht etwas zu sein, das ich verketten sollte.
var result = conn.Query<string>(procName, parameters, commandType: CommandType.StoredProcedure);
EDIT: Pro Kommentar-Anfrage, hier ist die gespeicherte Prozedur und Beispieldaten, die zurückgegeben wird. Dies tritt erst auf, wenn die XML-Daten eine bestimmte Größe erreicht haben. Kleinere Batches von XML-Daten verursachen dies nicht. Das hier bereitgestellte Beispiel sollte genügend Daten enthalten, um es auszulösen.
usp_ListAllGroups
SELECT
(SELECT ClassificationItemID AS '@ID', GroupCN AS '*'
FROM UserGroup WITH (NOEXPAND)
FOR XML PATH('Group'), TYPE)
FOR XML PATH('Groups');
Ergebnis XML
<Groups>
<Group ID="4">SomeGroupName</Group>
<Group ID="9">SomeGroupName</Group>
<Group ID="2">SomeGroupName</Group>
<Group ID="553">SomeGroupName</Group>
<Group ID="447">SomeGroupName</Group>
<Group ID="435">SomeGroupName</Group>
<Group ID="395">SomeGroupName</Group>
<Group ID="489">SomeGroupName</Group>
<Group ID="468">SomeGroupName</Group>
<Group ID="408">SomeGroupName</Group>
<Group ID="455">SomeGroupName</Group>
<Group ID="443">SomeGroupName</Group>
<Group ID="524">SomeGroupName</Group>
<Group ID="414">SomeGroupName</Group>
<Group ID="430">SomeGroupName</Group>
<Group ID="423">SomeGroupName</Group>
<Group ID="511">SomeGroupName</Group>
<Group ID="482">SomeGroupName</Group>
<Group ID="154">SomeGroupName</Group>
<Group ID="236">SomeGroupName</Group>
<Group ID="244">SomeGroupName</Group>
<Group ID="367">SomeGroupName</Group>
<Group ID="547">SomeGroupName</Group>
<Group ID="134">SomeGroupName</Group>
<Group ID="309">SomeGroupName</Group>
<Group ID="26">SomeGroupName</Group>
<Group ID="128">SomeGroupName</Group>
<Group ID="335">SomeGroupName</Group>
<Group ID="322">SomeGroupName</Group>
<Group ID="164">SomeGroupName</Group>
<Group ID="190">SomeGroupName</Group>
<Group ID="30">SomeGroupName</Group>
<Group ID="121">SomeGroupName</Group>
<Group ID="276">SomeGroupName</Group>
<Group ID="260">SomeGroupName</Group>
<Group ID="83">SomeGroupName</Group>
<Group ID="71">SomeGroupName</Group>
<Group ID="591">SomeGroupName</Group>
<Group ID="358">SomeGroupName</Group>
<Group ID="179">SomeGroupName</Group>
<Group ID="113">SomeGroupName</Group>
<Group ID="148">SomeGroupName</Group>
<Group ID="299">SomeGroupName</Group>
<Group ID="209">SomeGroupName</Group>
<Group ID="229">SomeGroupName</Group>
<Group ID="8">SomeGroupName</Group>
<Group ID="54">SomeGroupName</Group>
<Group ID="40">SomeGroupName</Group>
<Group ID="3">SomeGroupName</Group>
<Group ID="1">SomeGroupName</Group>
</Groups>
Um Ihre XML aus der gespeicherten Prozedur zu lesen, verwenden Sie die SqlCommand.ExecuteXmlReader-Methode, die Zeilen mit 2.033 Zeichen zurückgibt. Das ist Absicht. Ich habe den Dapper-Code nicht angeschaut, aber aus meinen Tests, Es scheint, dass Dapper das implementiert hat, was sehr cool ist.