以前に実装されたコードは、xls ファイルを取り込んで、ストリームを使用してテーブルの列に保存します。同じ方法を使用しますが、唯一の変更点は、保存されるファイルが xlsm または xlsx タイプのファイルであることです。データベース
データベースからコンテンツを取得しようとして、保存された xlsm ファイルまたは xlsx ファイルをスローすると、「Excel ファイルで読み取り不能なコンテンツが見つかりました。このブックのコンテンツを回復しますか?」というエラーが表示されます。
xlsm または xlsx ファイルを保存するコードは次のとおりです。
System.IO.Stream filestream = System.IO.File.Open(file, System.IO.FileMode.Open);
int fileLength = (int)filestream.Length;
byte[] input = new byte[fileLength];
filestream.Read(input, 0, fileLength);
string Sql = "insert into upload values(@contents)";
con.Open();
System.Data.SqlClient.SqlCommand c = new System.Data.SqlClient.SqlCommand(Sql, con);
c.Parameters.Add("@contents", System.Data.SqlDbType.Binary);
c.Parameters["@contents"].Value = input;
c.ExecuteNonQuery();
取得してユーザーに送信するには
SqlCommand comm = new SqlCommand("select contents from upload order by id desc", con);
SqlDataReader reader = comm.ExecuteReader();
int bufferSize = 32768;
byte[] outbyte = new byte[bufferSize];
long retval;
long startIndex = 0;
startIndex = 0;
retval = reader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
while (retval > 0)
{
System.Web.HttpContext.Current.Response.BinaryWrite(outbyte);
startIndex += bufferSize;
if (retval == bufferSize)
{
retval = reader.GetBytes(2, startIndex, outbyte, 0, bufferSize);
}
else
{
retval = 0;
}
}