2009-08-19 60 views
4

DataTable型のオブジェクトをvarbinary型のフィールドにSQL 2005データベースに保存しました。私はそれを元に戻したいと思っていますが、タイプキャストできませんでした。これは私がそれを保存した方法です。byte []配列を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(); 

} 

'dt'はDataTableオブジェクトのインスタンスです。

答えて

5

あなたの話はバイナリシリアル化と逆シリアル化です。たぶん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

strig 'S' の使用は何ですか? –

+0

@Ahmad:この例では、DataTableはバイト[]にシリアル化され、次にUTF8文字列としてエンコードされ、次にバイト[]とDataTableに戻されます。あなたはDBにバイトを格納しているので、それは無関係ですが、ntextとして格納するか、XMLに挿入したい場合、これはどうやって行うのでしょうか。 – MyItchyChin

1

データテーブルを扱うStreamWriterクラスの拡張メソッドを作成したことを伝えるまで、私はあなたを失望させてしまいます。

DataTableインスタンスを受け入れるWriteメソッドの唯一のオーバーロードは、オブジェクトを受け取るメソッドであり、MSDN documentationによれば、オブジェクトの "テキスト表現"のみが保存されます。

DataTableの.ToStringメソッドが、DataTableインスタンスのすべての内容を含む形式で文字列を出力することを期待します。 .ToStringメソッドのみがreturns the contents of the TableName propertyであり、表示式がある場合はそれが表示されます。

保存した内容は、DataTableインスタンスの内容ではなく、テーブルの名前だけです。

Serializationを調べると、DataTableオブジェクトのすべての内容のバイナリまたはXML表現を生成できるはずです。

0

あなたのコードはデータテーブルにシリアル化されているものとみなし、それを逆シリアル化する必要があります。私はどのフォーマッターが使用されたのかわからないので、あなたはバイナリフィールドの内容を見なければならないでしょう。バイナリの場合は、BinaryFormaterを使用してください(ページの下のサンプルコードを参照)。バイナリでない場合は、SoapFormatterとを試してください。

関連する問題