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' 的? – 2009-08-19 14:36:43

+0

@Ahmad:在這個例子中,一個DataTable被序列化爲一個byte [],然後編碼爲一個UTF8字符串,然後返回byte [],然後DataTable。由於您將字節存儲在數據庫中,因此無關緊要,但是如果您想將其作爲ntext存儲或將其插入到XML中,這將是您如何做到的。 – MyItchyChin 2009-08-19 15:05:54

1

恐怕我不得不讓你失望,至少在你告訴我們你已經爲處理數據表的StreamWriter類創建了一個擴展方法之前。

接受一個DataTable實例的Write方法的唯一的過載是一個接受一個對象,並且每MSDN documentation,其只保存對象的「文本表示」。

因此,我們希望DataTable的.ToString方法以包含DataTable實例的所有內容的格式輸出一個字符串,但嘆息。 .ToString方法只有returns the contents of the TableName property和一個顯示錶達式(如果存在)。

所以你保存的不是DataTable實例的全部內容,只有表的名字。

你應該看看Serialization,它應該能夠產生DataTable對象所有內容的二進制或XML表示。

0

我假設你的代碼只是序列化數據表,你必須反序列化它。我不知道使用了什麼格式化程序,因此您必須查看二進制字段的內容。如果它是二進制的,則使用BinaryFormater(參見頁面上的示例代碼)。如果不是二進制,請嘗試SoapFormatter和。