2009-06-09 14 views
0

以前に実装されたコードは、xlsファイルを取り込み、ストリームを使用してテーブルの列に保存します。同じ方法を使用しますが、保存されるファイルはxlsmまたはxlsxタイプのファイルですXLSMファイルをデータベース列に保存して取得しますか?

データベースから内容を取得し、保存したxlsmファイルまたはxlsxファイルをスローすると、「Excelファイルには読めないコンテンツが見つかりましたか?このブックの内容を回復しますか?」というエラーが表示されます。

ここでは可能性として私を打つ物事のカップルを取得し、ユーザー

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; 
      } 
     } 
+1

あなたはおそらく、あなたの説明から、として、私たちにいくつかのコードを示してもらえ何が問題なのかを言うことは不可能です。 – samjudson

+0

ストリームをサーバーに正しくプッシュしなかったようです。最も一般的な原因は、stream.Read(...)の返り値をメモしていないためです。 –

+0

コメントとして投稿されている間、コードはひどく見えます。私はコードで質問を編集しました。お気軽に –

答えて

0

に送信する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(); 

を保存するためのコードです。

まず、reader.Read()に電話していません。

第2に、retval == bufferSizeのチェックは必要ありません。GetBytesを再度呼び出すだけで、フィールドから読み込まれたバイトがない場合は0を返します。

第3に、HttpResponseに書き込むときに、出力にバイトを書き込む前にResponse.Clear()を呼び出し、レスポンスにファイルを書き込んだ後にResponse.End()を呼び出す必要があります。

もう1つの方法は、ファイルをハードドライブに保存し、元のファイルと比較することです。それは同じサイズですか?それが大きければ、ファイルにあまりにも多くの情報を書き込んでいます(前のHttpResponseに関するコメントを参照)。それが小さければ、あなたは十分な文章を書いていないので、ループをすぐに終了する可能性が非常に高いです(コメントはretvalを参照)。

+0

あなたの返信ありがとう上記の点 1. reader.Read()はifステートメントで使用され、trueの場合はバイナリデータを読み取るメソッドに進みます。 2. Response.Clearも使用しました 3.あなたが言及した余分なコードを削除しましたが、ファイルは正常にダウンロードされますが、開かれません。同じエラーが表示されます。 xlsxまたはxlsm形式の新しいMS Excelファイルが内部的に複数のxmlファイルを含むためですか? –

+0

ファイルの拡張子はコードに違いはありません。 .xlsファイルが正常に動作したが、.xlsxファイルではうまくいかなかったのは、おそらくExcelが.xlsファイルのフォーマットをより寛容にしていたからだろう。 ファイルサイズの問題で応答しません。ファイルを正しく読み書きしている場合は、ディスクに保存するときとまったく同じにする必要があります。 – samjudson

0

私は次のように、あなたのコードがusingブロックにIDisposableををラップに失敗した場所の数を助けることが気づきませんでした:

using (SqlConnection con = new SqlConnection(connectionString)) 
{ 
    byte[] input; 
    using (System.IO.Stream filestream = System.IO.File.Open(file, System.IO.FileMode.Open)) 
    { 
     int fileLength = (int)filestream.Length; 
     input = new byte[fileLength]; 
     filestream.Read(input, 0, fileLength); 
    } 
    const string Sql = "insert into upload values(@contents)"; 
    con.Open(); 
    using (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(); 
    } 

    using (SqlCommand comm = new SqlCommand("select contents from upload order by id desc", con)) 
    { 
     using (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; 
       } 
      } 
     } 
    } 
} 
関連する問題