2013-12-11 93 views
2

我不知道爲什麼SqlBulkCopy不會插入來自閱讀器的所有記錄。代碼:ASP.NET SqlBulkCopy不會插入服務器上的所有記錄

using (OleDbDataReader dr1 = cmd.ExecuteReader()) 
    { 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ss, SqlBulkCopyOptions.TableLock, null)) 
     { 
      bulkCopy.BulkCopyTimeout = 0; 
      bulkCopy.BatchSize = 500; 
      bulkCopy.DestinationTableName = tableName; 
      try 
      { 
       bulkCopy.WriteToServer(dr1); 
      } 
      catch (Exception ex) 
      { 
       Log.LogSystemLog(ex.ToString()); 
       return false; 
      } 

     } 

     GC.Collect(); 
     dr1.Close(); 
    }    

我想散裝大約300K條記錄。它運行時,我從本地運行到同一個數據庫,但是當我從服務器運行它 - 它總是插入~7K記錄...並沒有錯誤或異常。在服務器上有4GB可用RAM。在本地主機〜1,5GB。

我不知道爲什麼它在localhost上正常工作,但在服務器上它不是。

+2

SqlBulkCopy不是buggy。也許你的日誌記錄被破壞或者你錯過了日誌消息。刪除捕獲並讓錯誤冒泡。不要使用布爾返回值來傳播錯誤。這導致他們不容易注意到他們。或者,您的讀者返回的行數比您認爲的要少。 – usr

+0

但是爲什麼當我調試時(在本地主機上),相同的代碼工作正常? – user3091350

+2

也許數據不同或批次超時或有網絡短信。我們永遠不會知道你是否100%確信你會得到錯誤(如果有的話,可能會出現這種情況)。直到你沒有人可以幫助你。沒有錯誤信息,您將不會收到有用的答案。 – usr

回答

0

我有同樣的問題,通過添加以下內容到我的連接字符串解決。

IMEX = 1

實施例:

的ConnectionString = 「提供者= Microsoft.ACE.OLEDB.12.0;」 +「Data Source =」+ Server.MapPath(rutacom)+「;」 +「Extended Properties ='Excel 12.0 Xml; HDR = YES; IMEX = 1'」;

在我的本地主機工作完美,但不是在服務器上。

試試吧:)

注:

「HDR =是;」表示第一行包含列名,而不是數據。 「HDR =無;」表明相反。

要始終使用IMEX = 1是爲混合數據列檢索數據的更安全方法。考慮一個Excel文件可能正常工作的情況,因爲該文件的數據會導致驅動程序猜測一種數據類型,而另一個包含其他數據的文件會導致驅動程序猜測另一種數據類型。這可能會導致您的應用崩潰。

相關問題