将byte []数组转换为DataTable

时间:2009-08-19 13:45:19

标签: c# sql ado.net binary-serialization

我在类型为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对象实例。

4 个答案:

答案 0 :(得分:6)

你所说的是二进制序列化和反序列化。也许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();
        }
    }
}

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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