"无效试图调用读时,读者可闭合QUOT;错误(冗长的操作只) [英] "Invalid attempt to call Read when reader is closed" error (for lengthy operations only)

查看:304
本文介绍了"无效试图调用读时,读者可闭合QUOT;错误(冗长的操作只)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们已经在超过100.000记录是从CSV文件中读取,并在数据库中插入操作。当我使用具有10个记录的文件,则操作在不到一分钟内顺利完成。

当我使用100.000记录,我10分钟后得到以下错误无效的尝试调用read时读取器已关闭。有没有超时,我可以配置来避免这个问题?

注:将CommandTimeout已被设为零

 的DbCommand CMD = db.GetStoredProcCommand(aspInsertZip code);
cmd.CommandTimeout = 0;
dataStringToProcess.Remove(dataStringToProcess.Length  -  1,1);

db.AddInParameter(CMD,@DataRows,DbType.String,dataStringToProcess.ToString());
db.AddInParameter(CMDcurrDate,DbType.DateTime,DateTime.Now);
db.AddInParameter(CMD,用户ID,DbType.Int32,用户名);
db.AddOutParameter(CMDCountOfUnchangedZip code,DbType.String,1000);

DbDataReader RDR = NULL;

尝试
{

    RDR =(DbDataReader)db.ExecuteReader(CMD);
    如果(rdr.Read())
    {

        如果(!String.IsNullOrEmpty(Utility.GetString(RDR,NewZip code)))
            strNewZip code = strNewZip code +,+ Uti​​lity.GetString(RDR,NewZip code);

    }
    rdr.NextResult();
    如果(rdr.Read())
    {

        strRetiredZip code = strRetiredZip code +,+ Uti​​lity.GetString(RDR,RetiredZip code);

    }

    INT TempUnchageZipCount = Convert.ToInt32(db.GetParameterValue(CMDCountOfUnchangedZip code));
    CountOfUnchangedZip code = CountOfUnchangedZip code + TempUnchageZipCount;
    dataStringToProcess =新的StringBuilder();
    cntRec = 0;

}
抓住
{
    如果(RDR = NULL和放大器;!&安培;!(rdr.IsClosed))
        rdr.Close();
    扔;
}
最后
{
    如果(RDR = NULL和放大器;!&安培;!(rdr.IsClosed))
        rdr.Close();
}
cmd.Dispose();
 

解决方案

这实际上MSDTC和放大器;交易问题。我更新了MSDTC超时组件服务。此外,我在应用服务器中的machine.config更新的超时值System.Transactions中。

We have a operation in which more than 100.000 records are read from a csv file and inserted in a database. When I am using a file with 10 records, the operation is completed successfully in less than one minute.

When I use 100.000 records, I am getting the following error "Invalid attempt to call Read when reader is closed." after 10 minutes. Is there any Timeout that I can configure to avoid this error?

Note: The CommandTimeout is already set as zero.

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();

解决方案

It was actually MSDTC & Transaction issue. I updated the MSDTC timeout in Component Services. Also I updated timeout values in System.Transactions in machine.config of the application server.

这篇关于"无效试图调用读时,读者可闭合QUOT;错误(冗长的操作只)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆