Ошибка "Неправильная попытка вызова Read, когда читатель закрыт" (только для длительных операций)

У нас есть операция, при которой более 100 000 записей считываются из файла CSV и вставляются в базу данных. Когда я использую файл с 10 записями, операция завершается успешно менее чем за одну минуту.

Когда я использую 100.000 записей, я получаю следующую ошибку "Недопустимая попытка вызвать Read, когда читатель закрыт". Через 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();

2 ответа

Решение

На самом деле это был вопрос MSDTC & Transaction. Я обновил время ожидания MSDTC в компонентных службах. Также я обновил значения тайм-аута в System.Transactions в machine.config сервера приложений.

Может быть вместо этого тайм-аут базы данных... вы это проверили?

Что ты вообще пытаешься делать? Если вам действительно нужно прочитать так много строк, возможно, стоит подумать о том, чтобы сократить его до меньших кусков - скажем, читать только 1000 за раз

Другие вопросы по тегам