在我的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。这也引发了相同的错误。
感谢。
答案 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 ();