2009-08-19 8 views
4

gespeichert Ich ein Objekt vom Typ Datatable in SQL 2005-Datenbank in einem Feld vom Typ varbinary. Ich möchte es zurückholen, aber ich konnte es nicht eingeben. So habe ich es gespeichert.ein byte [] Array in Datatable

MemoryStream memStream = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(memStream); 

sw.Write(dt); 
con.Open(); 
using (SqlCommand cmd = new SqlCommand("INSERT INTO Tables(TableName, TableData, QuestionID) VALUES (@TableName, @TableData, @QuestionID)", con)) 
{ 
    cmd.Parameters.Add("@TableName", SqlDbType.VarChar).Value = "a new table"; 
    cmd.Parameters.Add("@TableData", SqlDbType.VarBinary,Int32.MaxValue).Value = memStream.GetBuffer(); 
    cmd.Parameters.Add("@QuestionID", SqlDbType.VarChar).Value = "2"; 
    cmd.ExecuteNonQuery(); 

} 

Das 'dt' ist die DataTable-Objektinstanz.

Antwort

5

Was Sie reden ist Binary Serialisierung und Deserialisierung. Vielleicht hilft this.

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Data; 
using System.Text; 

namespace Serial 
{ 
    public class Ser 
    { 
     public static byte[] StrToByteArray(string str) 
     { 
      UTF8Encoding encoding = new UTF8Encoding(); 
      return encoding.GetBytes(str); 
     } 

     public static string ByteArrayToStr(byte[] barr) 
     { 
      UTF8Encoding encoding = new UTF8Encoding(); 
      return encoding.GetString(barr, 0, barr.Length); 
     } 

     public static void Main(String[] args) 
     { 
      DataTable dt = new DataTable(); 
      DataRow dr; 

      dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32))); 
      dt.Columns.Add(new DataColumn("StringValue", typeof(string))); 
      dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime))); 
      dt.Columns.Add(new DataColumn("BooleanValue", typeof(bool))); 

      for (int i = 1; i <= 1; i++) 
      { 

       dr = dt.NewRow(); 

       dr[0] = i; 
       dr[1] = "Item " + i.ToString(); 
       dr[2] = DateTime.Now; 
       dr[3] = (i % 2 != 0) ? true : false; 

       dt.Rows.Add(dr); 
      } 

      //Serialize 
      BinaryFormatter bformatter = new BinaryFormatter(); 
      MemoryStream stream = new MemoryStream(); 

      string s; 
      bformatter.Serialize(stream, dt); 
      byte[] b = stream.ToArray(); 
      s = ByteArrayToStr(b); 
      stream.Close(); 
      dt = null; 

      //Now deserialise 
      bformatter = new BinaryFormatter(); 
      byte[] d; 
      d = StrToByteArray(s); 
      stream = new MemoryStream(d); 
      dt = (DataTable)bformatter.Deserialize(stream); 
      stream.Close(); 
     } 
    } 
} 
+0

Was ist die Verwendung des strig 'S'? –

+0

@Ahmad: In dem Beispiel wird eine DataTable in ein Byte [] serialisiert, dann als UTF8-String codiert und dann zurück zu Byte [], dann DataTable. Da Sie die Bytes in der DB speichern, ist es irrelevant, aber wenn Sie es als ntext speichern oder in XML einfügen möchten, wäre dies die Vorgehensweise. – MyItchyChin

1

Ich fürchte, ich werde Sie nicht enttäuschen, zumindest, bis Sie uns sagen, dass Sie eine Erweiterungsmethode für die Stream Klasse erstellt haben, die Datentabellen behandelt.

Die einzige Überlastung der Write Methode, die eine Datentabelle Instanz akzeptiert, ist die eine, die ein Objekt und die pro MSDN documentation nimmt, es speichert nur die „Textdarstellung“ des Objekts.

So lassen Sie uns hoffen, dass die .ToString Methode der Datatable eine Zeichenkette in einem Format ausgibt, das den gesamten Inhalt der Datatable-Instanz enthält, aber leider. Die .ToString-Methode nur returns the contents of the TableName property und ein Anzeigeausdruck, falls einer vorhanden ist.

Also, was Sie gespeichert haben, ist nicht der Inhalt der Datatable-Instanz alle, nur der Name der Tabelle.

Sie sollten in Serialization suchen, sollte es in der Lage sein, eine binäre oder XML-Darstellung aller Inhalte des DataTable-Objekts zu erzeugen.

0

Ich nehme an, Ihr Code hat nur die Datentabelle serialisiert und Sie müssen es deserialisieren. Ich weiß nicht, welcher Formatierer verwendet wurde, daher müssen Sie sich den Inhalt Ihres Binärfeldes ansehen. Wenn es sich um eine Binärdatei handelt, verwenden Sie die BinaryFormater (siehe Beispielcode auf der Seite). Wenn es nicht binär ist, versuchen SoapFormatter und .