.NET: Wie einfügen von XML-Dokumenten in SQL Server
Möchte ich einfügen, beliebige XML-Daten in SQL Server. Die XML-Daten, die in einer XmlDocument
Objekt.
Die Spalte, die ich einfügen möchte, ist entweder nvarchar
, ntext
oder xml
Spalte (Wenn es macht Ihr Leben einfacher, dann können Sie auswählen, welche Art es ist. Eigentlich ist es ein xml
Spalte.)
Prototyp
void SaveXmlToDatabase(DbConnection connection,
XmlDocument xmlToSave,
String tableName, String columnName);
{
}
Der Grund warum ich Frage ist, weil ich bin auf der Suche nach dem richtigen Weg, um drehen Sie den XmlDocument
in etwas von der Datenbank nehmen können - werden Sie sicher, dass die Kodierungen rechts:
- Ich haben, um sicherzustellen, dass die Codierung mit bei legen, dem entspricht, was die Datenbank übernimmt
- Ich habe zum synchronisieren der
<?xml version="1.0" encoding="windows-1252"?>
element
Ich weiß ntext
, nvarchar
oder xml
sind, werden als UTF-16
innerhalb von SQL Server. Also ich habe um sicher zu sein, geben die Daten in SQL Server als UTF-16. Dies ist nicht ein problem für String
s in .NET, da Sie sind unicode UTF-16.
Dem 2. problem, die Synchronisierung der encoding-Attribut, ist eine härtere Nuss zu knacken. Ich habe, um herauszufinden, wie man die element-Deklaration durch die XmlDocument
Objekt:
<?xml version="1.0" encoding="windows-1252"?> (or whatever the encoding may be)
und anpassen, um UTF-16
<?xml version="1.0" encoding="UTF-16"?>
Meiner naiven Versuch (fehl)
Ignorieren die Kodierung in der XML-Deklaration und genau herauszufinden, wie man alles sparen, in SQL-Server:
void SaveXmlToDatabase(DbConnection connection,
XmlDocument xmlToSave,
String tableName, String columnName);
{
String sql = "INSERT INTO "+tableName+" ("+columnName+")
VALUES ('"+xmlToSave.ToString()+"')";
using (DbCommand command = connection.CreateCommand())
{
command.CommandText = sql;
DbTransaction trans = connection.BeginTransaction();
try
{
command.ExecuteNonQuery();
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
throw;
}
}
}
Dies schlägt fehl, da die sql
ich versuche zu laufen, ist:
INSERT INTO LiveData (RawXML)
VALUES ('System.Xml.XmlDocument')
Dies ist, weil XmlDocument.ToString()
gibt "System.Xml.XmlDocument
". Spähen an der Umsetzung, es zu sehen, dass es buchstäblich ruft:
this.GetType().ToString();
Beiseite: Microsoft scheint gegangen aus dem Weg, um zu verhindern, dass Sie
den Xml-Code als Zeichenfolge -
vermutlich, weil es führt zu bugs
(Aber Sie sagen uns nicht, was für Fehler, warum
Sie sind bugs, oder die Recht Weg
konvertieren einerXmlDocument
in eine
String
!)
Siehe auch
- C#/SQL - Was ist falsch mit SqlDbType.Xml in Verfahren ?
- Wie konvertieren von XmlDocument, um XmlReader für SqlXml Datentyp.
- diese Frage kann bezogen werden: stackoverflow.com/questions/574928/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie ein SqlParameter.
Ich würde empfehlen, tun Sie es so:
und die SQL sollte so Aussehen:
Und da das erste Kind ist immer der xml-Knoten, können Sie ersetzen Sie die Codierung mit der folgenden Anweisung.
Alles in allem würde es dann so Aussehen:
xmlToSave.ToString()
, denn das gibt die Zeichenfolge "System.Xml.XmlDocument
", die nicht gültig ist XML.<?xml?>
Erklärung. Auch, es sollte wirklich manipulieren der xml-Deklaration über dieXmlDeclaration
- Objekt (msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx), sondern als text direkt ein. Sobald ich etwas freie Zeit werde ich untersuchen, wie man richtig finden der XmlDeclaration, wenn es vorhanden ist, und aktualisieren Sie esEncoding
(msdn.microsoft.com/en-us/library/...) Eigenschaft, und aktualisieren Sie dann Ihre Antwort. ich habe nicht vergessen über Sie!Die einfachste Lösung ist die Verwendung die OuterXml-Attribut des Dokuments. Stieß ich auf Ihre Frage, während Sie versuchen, das problem zu lösen unter der Bedingung, dass ich konnte nicht ausgeführt eine gespeicherte Prozedur. OuterXml gibt den string zurück, der text, den Sie erwarten, zu bekommen .Wert oder .ToString()
Besser spät als nie... ich denke du suchst so etwas:
Den XmlNodeReader Objekt durchläuft und richtig codiert die XmlDocument (oder jede andere XmlNode), und die SqlXml-Objekt kapselt, die in der SqlDbType-geeignet für den Einsatz mit dem parameter. Das ist sicherer und wahrscheinlich effizienter ist, als mit einem string Vermittler.
Wollte nur hinzufügen, ein SQLConnection-entspricht Jonathan Overholt-Lösung:
Getestet OK in Visual studio 2017 und 2013 mit .net bis version 4.6.2, und gegen MS SQL Server 2008 R2, 2012 und 2016
Wenn eine Identität einfügen fehl, und Sie möchten den Vorgang zu stoppen, dann, legen Sie einfach eine Zeile nach der Transaktion.Rollback() wie folgt:
Oder Sie stoppen kann das Verfahren in jeder Situation, indem Sie die Transaktion.Rollback(); und werfen; Linien nur außerhalb der bedingte (if)