.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 Strings 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 einer XmlDocument in eine
String!)

Siehe auch

InformationsquelleAutor Ian Boyd | 2010-08-26
Schreibe einen Kommentar