【问题标题】:"Invalid attempt to call Read when reader is closed" error (for lengthy operations only)“阅读器关闭时调用读取无效”错误(仅适用于长时间操作)
【发布时间】:2011-10-10 03:33:21
【问题描述】:

我们有一个操作,其中从 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();

【问题讨论】:

  • 我看到你正在传递Reader,它是否因为吞下异常而在它们内部关闭?
  • 我猜你找到了解决方案并将其发布为答案?

标签: c# .net asp.net sql-server ado.net


【解决方案1】:

可能是数据库超时...您检查了吗?

你到底想做什么?如果你真的需要读取这么多行,或许可以考虑将其缩减为更小的块——比如说,一次只能读取 1000 行

【讨论】:

  • 我检查了数据库服务器。远程查询超时设置为 600 秒。我更改为零并重新启动服务器。仍然发生同样的错误。任何其他 10 分钟(或 600 秒)的设置?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多