Ключевое слово не поддерживается MultipleActiveResultSets - PullRequest
1 голос
/ 24 февраля 2010

Мы используем пользовательский членский член в приложении ASP.NET MVC. Мы испытывали периодическое 'System.InvalidOperationException - уже есть открытый DataReader, связанный с этой Командой, который должен быть закрыт сначала. проблемы с классом, поэтому я решил включить MARS.

Это строка подключения в веб-конфигурации ...

<add name="CustomMembershipServices" connectionString="User ID=CUSTOM_USER;Password=pwd;Database=OUR_DB;Server=.\SQLEXPRESS;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />

Наш код теперь выдает исключение ArgumentException: ключевое слово не поддерживается: «множественные активные записи» в следующей строке.

protected void CreateAndOpenConnection()
{
    // Exception thrown here...
    _connection = new SqlConnection(_connectionString);
    _connection.Open();
}

То же исключение наблюдается при нацеливании на версии SQL2005 Express и SQL2008 Standard. Есть предложения?

В ответ на AdaTheDev вот метод, который использует устройство чтения данных ...

public bool CheckUserPassword(long userID, string password)
{
    bool success = false;

    if (!string.IsNullOrEmpty(password))
    {
        try
        {
            CreateAndOpenConnection();

            using (SqlCommand cmd = CreateSqlCommandForStoredProcedure("CheckPassword"))
            {
                IPasswordUtility generator = new PasswordUtility();

                cmd.Parameters.AddWithValue("UserID", userID);
                cmd.Parameters.AddWithValue("Password", generator.HashPassword(password));

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    success = reader.HasRows;

                    reader.Close();
                }
            }
        }
        finally
        {
            CloseConnection();
        }
    }

    return success;
}

Я не вижу причин, по которым это может привести к созданию нескольких считывателей данных в одном соединении.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Проблема связана с тем, что среда провайдера ASP.NET рассматривает мой класс как статический синглтон ...

"Вопрос: когда статический класс статичен?"

2 голосов
/ 24 февраля 2010

Если вам не нужен MARS по функциональной причине, я бы рекомендовал сосредоточиться на основной проблеме - похоже (и я могу ошибаться!) Ожидаемое / предполагаемое поведение класса - не открывать несколько читателей данных для одно соединение одновременно.

Если это так, то вам следует убедиться, что носители данных закрыты должным образом, прежде чем другой будет открыт по тому же соединению - похоже, что существует ситуация, когда этого не делается. Использование MARS в качестве обходного пути все равно оставляет тот факт, что что-то не закрывается должным образом.

Редактировать 1: Этот код выглядит нормально для меня с точки зрения очистки носителей данных и т. Д. Если не происходит многопоточность, вызывающая проблему из-за использования общего объекта _connection? (Я сомневаюсь, что это так). Существуют ли другие методы в классе, которые не закрывают устройство чтения данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...