2011-07-21 70 views
0

我們有一個操作,其中從csv文件讀取超過100.000條記錄並將其插入到數據庫中。當我使用10個記錄的文件時,操作在不到一分鐘內成功完成。「讀取器關閉時調用Read無效嘗試」錯誤(僅適用於長時間操作)

當我使用100.000條記錄時,出現以下錯誤:「10分鐘後,無法嘗試在讀取器關閉時調用Read」。是否有任何可以配置以避免此錯誤的超時?

注意:CommandTimeout已被設置爲零。

DbCommand cmd = db.GetStoredProcCommand("aspInsertZipCode"); 
cmd.CommandTimeout = 0; 
dataStringToProcess.Remove(dataStringToProcess.Length - 1, 1); 

db.AddInParameter(cmd, "@DataRows", DbType.String, dataStringToProcess.ToString()); 
db.AddInParameter(cmd, "currDate", DbType.DateTime, DateTime.Now); 
db.AddInParameter(cmd, "userID", DbType.Int32, UserID); 
db.AddOutParameter(cmd, "CountOfUnchangedZipCode", DbType.String, 1000); 

DbDataReader rdr = null; 

try 
{ 

    rdr = (DbDataReader)db.ExecuteReader(cmd); 
    if (rdr.Read()) 
    { 

     if (!String.IsNullOrEmpty(Utility.GetString(rdr, "NewZipCode"))) 
      strNewZipCode = strNewZipCode + "," + Utility.GetString(rdr, "NewZipCode"); 

    } 
    rdr.NextResult(); 
    if (rdr.Read()) 
    { 

     strRetiredZipCode = strRetiredZipCode + "," + Utility.GetString(rdr, "RetiredZipCode"); 

    } 

    int TempUnchageZipCount = Convert.ToInt32(db.GetParameterValue(cmd, "CountOfUnchangedZipCode")); 
    CountOfUnchangedZipCode = CountOfUnchangedZipCode + TempUnchageZipCount; 
    dataStringToProcess = new StringBuilder(); 
    cntRec = 0; 

} 
catch 
{ 
    if (rdr != null && (!rdr.IsClosed)) 
     rdr.Close(); 
    throw; 
} 
finally 
{ 
    if (rdr != null && (!rdr.IsClosed)) 
     rdr.Close(); 
} 
cmd.Dispose(); 
+0

我看到你正在傳遞'Reader',它是否因吞下的異常而被關閉? – V4Vendetta

+0

我想你找到了解決方案並將其作爲答案發布? – V4Vendetta

回答

0

它實際上是MSDTC &交易問題。我更新了組件服務中的MSDTC超時。此外,我更新了應用程序服務器的machine.config中System.Transactions中的超時值。

1

可能是一個數據庫超時而是......你檢查了嗎?

你究竟想要做什麼?如果你真的需要閱讀這麼多行,也許可以考慮將它縮小成更小的塊 - 比如說,一次只讀1000個。

+0

我檢查了數據庫服務器。遠程查詢超時設置爲600秒。我改爲零並重新啓動服務器。仍然有同樣的錯誤發生。任何其他設置是10分鐘(或600秒)? – Lijo

相關問題