2013-06-13 3 views
1

С этим командом уже открыт открытый DataReader, который должен быть закрыт первым .Выпуск в строке соединения уже открытого DataReader

Я сталкиваюсь с этой проблемой, когда тот же человек открывает ту же страницу одновременно с другой системой. Я много искал об этом, но не нашел успешного решения.

Я устал:

  1. MultipleActiveResultSets = true в строке соединения
  2. Увеличение подключения времени ожидания
  3. Проверенные все соединения закрыты

Этот вопрос приходит только тогда, когда вышеуказанное условие создано. Пожалуйста, дайте мне знать решение, которое действительно работает

это моя функция соединение, которое им с помощью

public DataSet SelectDs(string str) 
{ 
    DataSet ds = new DataSet(); 

    if (con.State == ConnectionState.Closed) 
    { 
     con.ConnectionString = ConStr; 
     con.Open(); 
    } 

    cmd.CommandText = str; 
    cmd.Connection = con; 
    cmd.CommandTimeout = 12000; 
    adpt.SelectCommand = cmd; 
    adpt.Fill(ds); 

    con.Close(); 
    return ds; 
} 
+0

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

+0

можете ли вы поделиться некоторым кодом, где вы получите эту ошибку? –

+0

@AltafSami это происходит на всех страницах, которые я разделяю с моей функцией соединения для набора данных –

ответ

2

Это смертельный грех, чтобы использовать глобальный объект соединения таким образом. Это плохо (очень плохо) в приложениях WinForms, но в ASP.NET смертельно опасно. (Как вы обнаружили)

Схема использования для одноразового использования объекта (и дорогой, как соединение) является

CREATE, OPEN, USE, CLOSE, DESTROY 

Механизм Connection Pooling существуют, чтобы облегчить использование этой модели.
Вместо этого вы пытаетесь работать против него, и вы платите за последствия.

Ваш код должен быть переписан в

public DataSet SelectDs(string str) 
{ 
    DataSet ds = new DataSet(); 

    using(SqlConnection con = new SqlConnection(constring)) // CREATE 
    using(SqlCommand cmd = new SqlCommand(str, con))   // CREATE 
    { 
     con.Open(); // OPEN 
     cmd.CommandTimeout = 12000; 
     using(SqlAdapter adpt = new SqlAdapter(cmd)) // USE 
      adpt.Fill(ds); 

     return ds; 
    } // CLOSE & DESTROY 
} 
1

Как о вводе внутри Использование заявления как

using(SqlConnection connection = new SqlConnection("connection string")) 
{ 

connection.Open(); 

using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection)) 
{ 
    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     if (reader != null) 
     { 
      while (reader.Read()) 
      { 
       //do something 
      } 
     } 
    } // reader closed and disposed up here 

    } // command disposed here 

} //connection closed and disposed here 
+0

Я не могу использовать его, потому что для этого потребуется большой класс в моем классе подключения. Я использую общий объект. –

+0

. Тогда у вас будут трудные времена перед вами – Steve

0

в наконец пункте использования этого

if (readerObj.IsClosed == false) 
{ 
    readerObj.Close(); 
} 
0

Я думаю, вы должны также располагать ваш объект команды перед возвратом набора данных.

попробовать cmd.Dispose() после con.close()

Смежные вопросы