2012-02-23 13 views
0

ファイルアップロードコントロールでファイルをアップロードしています。次にストリームリーダーがファイルを読み込み、SQLデータベースにコピーします。適切な列。誰かが下のコードで何か間違っているのを見ますか?エラーメッセージは表示されませんが、IISプロセスでハングアップしているようです。私は、プロセスがまだ動作しているので、フォルダからcsvファイルを削除することはできません。sqlのバルクコピーは、ファイルストリームを使用してデータベースにデータをアップロードしません。

protected void btnUpload_Click(object sender, EventArgs e) 
    { 

     //upload file to the gencouploadfiles folder 
     UploadFile(); 

     //fetch CSV file from the folder 
     string strFilePath = Server.MapPath("GencoUploadFiles") + "\\" + "GencoUploadFile.txt"; 

     //perform sql bulk copy 
     PerformBulkCopy(GencoUpload(strFilePath)); 

     //delete the file from the folder 
    } 



    public void UploadFile() 
    { 
     if (fileUpload1.HasFile) 
     { 
      FileInfo fileinfo = new FileInfo(fileUpload1.PostedFile.FileName); 
      string strCsvFilePath = Server.MapPath("GencoUploadFiles") + "\\" + "GencoUploadFile.txt"; 
      fileUpload1.SaveAs(strCsvFilePath); 
     } 
    } 


    public static DataTable GencoUpload(string filepath) 
    { 
     StreamReader sr = new StreamReader(filepath); 
     string line = sr.ReadLine(); 
     string[] value = line.Split('|'); 
     DataTable dt = new DataTable(); 
     DataRow row; 

     foreach (string dc in value) 
     { 
      dt.Columns.Add(new DataColumn(dc)); 
     } 

     while (!sr.EndOfStream) 
     { 
      value = sr.ReadLine().Split('|'); 
      if (value.Length == dt.Columns.Count) 
      { 
       row = dt.NewRow(); 
       row.ItemArray = value; 
       dt.Rows.Add(row); 
      } 
     } 
     return dt; 
    } 


    public void PerformBulkCopy(DataTable dt) 
    { 
     SqlConnection conStr = new SqlConnection(ConfigurationManager.ConnectionStrings["EDI"].ConnectionString); 

     using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conStr.ConnectionString)) 
     { 
      bulkcopy.DestinationTableName = "dbo.GencoUploadTempTable"; 
      bulkcopy.BatchSize = dt.Rows.Count; 
      conStr.Open(); 
      bulkcopy.WriteToServer(dt); 
      bulkcopy.Close(); 
      conStr.Close(); 
     } 
    } 
+0

DataTableではなくSqlDataReaderを使用できますか..? – MethodMan

+0

SQLの一括コピーは正常に動作するはずですが、WindowsサービスでのみWebページで使用したことはありません。あなたは私たちにファイルサイズのアイデアを教えてもらえますか?基本的には、ファイル全体をサーバーに一括してバッチ処理しているようです。あなたはこれを行うときにサーバーのメモリ使用率を調べましたか?これは基本的にファイルをデータテーブルにロードするときにファイル全体をメモリに格納しているため、ファイルが巨大な場合にサーバーが劣化する可能性があります。 – swannee

+0

正常に動作するはずです。ファイルはサーバーにアップロードされ、SqlBulkCopyはローカルサーバーのファイルシステムからdbに実行されます - 実際にファイルが実際にアップロードされている場合(この場合はファイルがサーバー側にロックされています;-) – dash

答えて

0

コードを簡略化します。 csvをデータテーブルに入れる方法はたくさんあります。たとえば、How to read a CSV file into a .NET Datatableを参照してください。上記の例では、ストリームの読み込みが終了した後でストリームを閉じているようには見えません。戻りの前にsr.Close()を追加するか、using()ステートメントで宣言をラップしてください。

public static DataTable GencoUpload(string filepath) 
    { 
     DataTable dt = new DataTable(); 

     using(StreamReader sr = new StreamReader(filepath)) 
     { 
      string line = sr.ReadLine(); 
      string[] value = line.Split('|'); 

      DataRow row; 

      foreach (string dc in value) 
      { 
       dt.Columns.Add(new DataColumn(dc)); 
      } 

      while (!sr.EndOfStream) 
      { 
       value = sr.ReadLine().Split('|'); 
       if (value.Length == dt.Columns.Count) 
       { 
        row = dt.NewRow(); 
        row.ItemArray = value; 
        dt.Rows.Add(row); 
       } 
      } 
     } 

     return dt; 
    } 

これにより、ファイルがロックされないようにする必要があります。

次に、データテーブルに実際にデータが含まれているかどうかを確認します。ブレークポイントを設定し、ロードコードが実際に動作しているかどうかをテストします。データ表に行を追加していますが、列構造を定義していません(データ型ではない名前しか指定していないため、変換の問題が発生する可能性があります)。

関連する問題