Ошибка C # / SQL Server «Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым». - PullRequest
0 голосов
/ 31 марта 2012

Итак, я получаю сообщение об ошибке согласно строке заголовка.Кажется довольно очевидным, но, насколько я понимаю, объекты в блоке «использование» удаляются?Эта ошибка появилась после того, как другая незначительная ошибка прервала выполнение кода, поэтому, возможно, я застрял с открытым считывателем, который мне нужно закрыть или закрыть?Любая помощь будет оценена?

public override long GetStatsBenchmark(String TableName)
{
    using (SqlCommand cmd = new SqlCommand("sprocReturnDataPointBenchmark", this.sqlConnection))
    {
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        SqlParameter outputParameter = new SqlParameter
        {
            ParameterName = "@benchmark",
            Direction = System.Data.ParameterDirection.Output,
            SqlDbType = System.Data.SqlDbType.BigInt,
        };
        cmd.Parameters.Add(outputParameter);
        SqlParameter inputParameter = new SqlParameter
        {
            ParameterName = "@tblName",
            Direction = System.Data.ParameterDirection.Input,
            SqlDbType = System.Data.SqlDbType.NVarChar,
            Value = TableName
        };
        cmd.Parameters.Add(inputParameter);
        cmd.ExecuteNonQuery();

        return (long)outputParameter.Value;
    }
}

Ответы [ 3 ]

1 голос
/ 31 марта 2012

Проблема с предложением using заключается в том, что он не обеспечивает способ обработки исключений в неявном блоке try / finally, который генерирует для вас компилятор.

Вы можете 1) оберните ваше предложение с помощью try / catch или 2) вручную использовать код try / catch / finally вместо использования, вызывая Dispose в блоке finally и добавляя обработку исключений в блоке catch.

Есть небольшие недостатки в любой технике, но любая из них будет работать

1 голос
/ 31 марта 2012

Я не думаю, что код, который вы показали, является причиной проблемы.В то время как хорошей практикой является удаление SqlCommand (IDbCommand) объектов, на практике я не нашел в этом необходимости. необходимо , чтобы избавиться от SqlDataReader (IDataReader) объектов после их использования.Как следует из сообщения об ошибке, поищите в своем коде объект SqlDataReader, который не удаляется.Исключение может быть вызвано из кода, который вы отображаете, но я подозреваю, что причина кроется в SqlDataReader, связанном с тем же SqlConnection, использованным ранее при выполнении программы, который не был утилизирован.

0 голосов
/ 12 апреля 2012

Вы можете добавить MARS (несколько активных наборов результатов) в строку подключения, чтобы разрешить одновременное открытие нескольких наборов записей (или аналогичных).

Добавить

MultipleActiveResultSets=true;

или

MARS Connection=True;

к строке подключения (http://www.connectionstrings.com/sql-server-2008), и это позволит использовать несколько дескрипторов, но если предыдущая операция была «прервана» в исключении, попробуйте не использовать «USING» или использовать внутри нее попытку / перехват.

...