2014-10-03 2 views
0

Я переписываю часть старого приложения webforms. Я хочу сделать центральную функцию, которая будет выполнять выбранные запросы. Я буду кормить его SQL-запрос и параметры, и он сделает все остальное.Хранить MySqlDataReader в переменной

До сих пор у меня есть это:

MySqlDataReader DoRead(string query, params MySqlParameter[] pms) 
{ 
    MySqlCommand myCommand; 

    if (!myConnection) 
     myConnection = new MySqlConnection(sCon); 

    if (myConnection.State != ConnectionState.Open) 
    { 
     myConnection.Close(); 
     myConnection.Open(); 
    } 

    myCommand    = myConnection.CreateCommand(); 
    myCommand.CommandText = query; 
    foreach (MySqlParameter p in pms) 
    { 
     myCommand.Parameters.Add(p); 
    } 

    return myReader = myCommand.ExecuteReader(); 
} 

Мой вопрос, могу ли я сохранить результаты myReader переменной и возвращает эту же переменную вместо myReader только чтобы я мог закрыть соединение и читателя немедленно в функции вместо этого в коде ?

+1

Да, вы можете это сделать. Вы можете сохранить набор результатов в DataTable и вместо этого вернуть DataTable. Наряду с этим, я вижу несколько логических ошибок в вашем выше опубликованном коде. – Rahul

+0

Короткий ответ: да. Просто прочитайте все данные от читателя до, скажем, 'DataTable' или' List ', закрыть соединение и вернуть этот тип данных или список. Но обратите внимание: вам не следует хранить сам datareader, но читать данные из него и хранить данные. –

ответ

2

Конечно. И это именно то, что вы должны делать, по той причине, вы заявляете:

, чтобы я мог закрыть соединение и читателя непосредственно в функции

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

Как приложение может использовать этот читатель? Если вы пытаетесь создать общую функцию, то результат тоже должен быть довольно общим. Так что, если потребительский код все делает пользовательские вещи с читателем, то, возможно, вы можете вместо этого вернуть DataSet, а потребительский код может делать с ним что-то необычное. Что-то вроде этого:

var result = new DataSet(); 

using(var myConnection = new MySqlConnection(sCon)) 
{ 
    myConnection.Open(); 
    var myCommand = myConnection.CreateCommand(); 
    myCommand.CommandText = query; 
    foreach (var p in pms) 
     myCommand.Parameters.Add(p); 
    var myAdapter = new MySqlDataAdapter(myCommand); 

    myAdapter.Fill(result); 
} 

return result; 

(Обратите внимание, что я сделал еще одно изменения здесь, а объект соединения также должен быть локальным для сферы применения методы объекты Shared соединений открывают мир потенциальных проблем, один.. из которых вы, несомненно, пытались исправить с этим условием, чтобы закрыть/открыть состояние соединения. Просто избегайте этого мира проблем полностью и удаляйте соединения, как только вы закончите с ними.)

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