【问题标题】:Problem converting a byte array into datatable将字节数组转换为数据表的问题
【发布时间】:2010-05-21 09:35:36
【问题描述】:

在我的 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。可能的原因是无效的流或序列化和反序列化之间的对象版本更改。

谁能告诉我我做错了什么?

我也试过将字节数组转换为字符串,然后将字符串转换回字节数组并转换为数据表。这也抛出了同样的错误。

谢谢。

【问题讨论】:

  • 你上传的是什么文件?
  • 我正在上传 Excel 表格。

标签: c# asp.net serialization


【解决方案1】:

是什么让您认为可以将电子表格反序列化为数据表?你绝对不能!您需要做的就是将 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 ();

【讨论】:

  • 实际上我想将电子表格中的数据按原样(如行和列)存储在 mysql 表中。所以我试图将字节数组反序列化到数据表中,我将使用 mysql 从中插入数据查询。不能将字节数组(mydata)转换为数据表吗?
  • @Kranthi。一点都不。我认为您并不完全了解序列化/反序列化的作用。尝试阅读它:msdn.microsoft.com/en-us/library/7ay27kt9(VS.71).aspx 正如我之前所说,您需要做的就是将字节插入数据库。我会用一个例子来更新我的答案。
  • 非常感谢您用@klausbyskov 的示例进行解释。实际上,我的要求是我应该允许用户浏览电子表格,然后读取文件的内容并在数据库中创建一个表,然后将电子表格中存在的所有数据(行和列)插入表格中。从您的帖子中,我认为我遵循错误的方法来实现我的要求。请纠正我。
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 2011-11-02
  • 2022-01-07
相关资源
最近更新 更多