将字节数组转换为数据表的问题

时间:2010-05-21 09:35:36

标签: c# asp.net serialization

在我的aspx页面中,我有一个HTML输入文件类型,允许用户浏览电子表格。一旦用户选择要上传的文件,我想阅读电子表格的内容并将内容存储到mysql数据库表中。

我使用以下代码读取上传文件的内容并将其转换为数据表,以便将其插入数据库表。

if (filMyFile.PostedFile != null)
        {
            // Get a reference to PostedFile object
            HttpPostedFile myFile = filMyFile.PostedFile;

            // Get size of uploaded file
            int nFileLen = myFile.ContentLength;

            // make sure the size of the file is > 0
            if (nFileLen > 0)
            {
                // Allocate a buffer for reading of the file
                byte[] myData = new byte[nFileLen];

                // Read uploaded file from the Stream
                myFile.InputStream.Read(myData, 0, nFileLen);

                DataTable dt = new DataTable();

               MemoryStream st = new MemoryStream(myData);
               st.Position = 0;
               System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
               dt=(DataTable)formatter.Deserialize(st);
}
}

但是当我尝试将字节数组反序列化为数据表时,我收到以下错误。

二进制流“0”不包含有效的BinaryHeader。可能的原因是序列化和反序列化之间的流或对象版本更改无效。

有人可以告诉我,我做错了什么吗?

我也尝试将bytearray转换为字符串,然后将字符串转换回字节数组并转换为datatable。这也引发了相同的错误。

感谢。

1 个答案:

答案 0 :(得分:0)

是什么让您认为可以将电子表格反序列化为数据表?你肯定不会!您需要做的就是将byte [](myData)保存到mysql数据库中相应表中的VARBINARY列。

修改

你可以按照以下方式做点什么:

假设你有一个mysql表:

create table MyTable(
   Id INTEGER AUTO_INCREMENT
   SpreadSheet BLOB 
) ENGINE=InnoDB;

您可以使用以下代码将上传的文件插入表格中:

string strConn="PROVIDER=MySQLProv;SERVER=192.168.1.8;DB= test;UID=test;PWD=;PORT=;";
OleDbConnection objConn;
objConn=new OleDbConnection (strConn);
objConn.Open();
string sql="INSERT INTO MyTable (SpreadSheet) VALUES(?)";
OleDbCommand cmd = new OleDbCommand(sql,objConn);
OleDbParameter param = new OleDbParameter ("@image",OleDbType.Binary );
param.Value = myData;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
objConn.Close ();