2012-02-23 69 views
0

我通過文件上傳控件上傳文件,然後流讀取器讀取文件itno數據表,然後sql批量複製將數據表複製到我的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

您可以使用SqlDataReader而不是DataTable ..? – MethodMan 2012-02-23 21:53:01

+0

SQL批量複製應該可以正常工作,但我從來沒有在網頁中使用它,只能在Windows服務中使用它。你能給我們一個關於文件大小的想法嗎?它看起來基本上是將整個文件一次性推送到服務器。你在做這件事情時是否檢查過服務器的內存利用率?這基本上是在將整個文件加載到數據表中時將整個文件存儲在內存中,以便在文件很大的情況下降低服務器的性能。 – swannee 2012-02-23 22:03:57

+0

它應該可以正常工作;該文件被上傳到服務器,然後SqlBulkCopy從本地服務器文件系統到數據庫 - 如果文件實際上傳了,當然(在這種情況下,因爲文件被鎖定在服務器端;-) – dash 2012-02-23 22:10:19

回答

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

這應該防止文件被鎖定。

接下來要看的是檢查數據表是否實際上有任何數據。設置一箇中斷點並測試以確定您的加載代碼是否實際工作;您正在將數據行添加到數據表中,但尚未定義列結構(即,您只提供名稱而非數據類型,因此可能會遇到轉換問題)。這肯定會更容易使用其他方法之一加載您的文件:-)

相關問題