将byte 数组转换为DataTable

我在类型为varbinary的字段中将DataTable类型的对象保存到SQL 2005数据库中。 我想要找回它,但我无法输入它。 这就是我拯救它的方式。

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对象实例。

你所说的是二进制序列化和反序列化。 也许这会有所帮助。

 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(); } } } 

我担心我不得不让你失望,至少在你告诉我们你已经为处理数据表的StreamWriter类创建了一个扩展方法之前。

接受DataTable实例的Write方法的唯一重载是获取对象的重载,并且根据MSDN文档 ,它仅保存对象的“文本表示”。

所以,我们希望DataTable的.ToString方法以包含DataTable实例的所有内容的格式输出一个字符串,但是唉。 .ToString方法仅返回TableName属性的内容 ,以及显示表达式(如果存在)。

所以你保存的不是DataTable实例的全部内容,只是表的名称。

您应该查看序列化 ,它应该能够生成DataTable对象的所有内容的二进制或XML表示。

我假设您的代码只是序列化了数据表,您必须反序列化它。 我不知道使用了什么格式化程序,因此您必须查看二进制字段的内容。 如果是二进制文件,请使用BinaryFormater (请参阅页面中的示例代码)。 如果它不是二进制文件,请尝试使用SoapFormatter和XmlSerializer 。

最好使用XmlSerializer或BinaryFormatter来序列化DataTable,然后存储在二进制列中。

这样做的链接:
http://sadeveloper.net/forums/p/439/1772.aspx
http://bytes.com/topic/net/answers/428472-serializing-datatable