“读取器关闭时调用Read的无效尝试”错误(仅适用于冗长的操作)

我们有一个操作,从csv文件中读取超过100.000条记录并插入数据库。 当我使用包含10条记录的文件时,操作在不到一分钟的时间内成功完成。

当我使用100.000记录时,我在10分钟后收到以下错误“无效尝试在读取器关闭时调用读取”。 是否有可以配置的超时以避免此错误?

注意: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(); 

可能是数据库超时……你检查了吗?

无论如何你还想做什么? 如果你真的需要读取如此多的行,或许可以考虑将其缩小为更小的块 – 比如说,一次只读取1000个

这实际上是MSDTC和交易问题。 我更新了组件服务中的MSDTC超时。 我还更新了应用程序服务器的machine.config中的System.Transactions中的超时值。