ОШИБКА: уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым.Несколько пользователей - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть приложение asp.net C # (.net 4.0), подключенное к SQL Server 2012 с помощью ADO.Net, и я обнаружил ошибку, которая говорит:

[InvalidOperationException: уже существует открытый DataReader, связанный сэта команда, которая должна быть закрыта первой.]

Я очень хорошо знаю, что такое DataReader, но моя проблема заключается в получении этой ошибки в следующих условиях:

  • У меня нетвообще использовал любой DataReader в моем приложении, я только использовал DataAdapters везде.Код работает нормально при работе в локальной среде и ошибок нет.

  • Приложение работает нормально даже после развертывания в IIS7 при использовании одним пользователем.

  • Ошибка возникает только тогда, когда несколько пользователей начинают использовать веб-сайт, размещенный в IIS7.

Пожалуйста, помогите, ятакже сомневаюсь в каких-либо проблемах с моим хостингом в IIS7

1 Ответ

0 голосов
/ 14 декабря 2018

После долгих проб и ошибок, наконец, я обнаружил, что это проблема с SqlConnections.То, что я делал, это открывал соединение при создании объекта уровня DAL.Таким образом, всякий раз, когда два метода из одного и того же объекта DAL вызывались вместе, он генерировал ошибку.Я решил это, открывая и закрывая соединение при каждом обращении к базе данных. Теперь все отлично работает .Это также позволяет максимальное количество пользователей использовать приложение одновременно.Ниже приведен пример кода из DAL: -

DataTable dt = new DataTable();

try
{
    using (SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString()))
    {
        if (sqlcon.State == ConnectionState.Closed)
            sqlcon.Open();

        SqlCommand sqlCommand = new SqlCommand
        {
            Connection = sqlcon,
            CommandType = CommandType.StoredProcedure,
            CommandText = "MyStoredProc"
        };

        sqlCommand.Parameters.AddWithValue("@Parameter1", Parameter1);

        using (SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand))
        {
            adapter.Fill(dt);
        }
    }
    return dt;
}
catch (Exception exp)
{
    LogHelper.LogError(string.Concat("Exception Details: ", ExceptionFormatter.WriteExceptionDetail(exp)));
    throw exp;
}
finally
{
    dt.Dispose();
}

Пожалуйста, опубликуйте лучший способ сделать это, если вы знаете, спасибо.

...