2014-10-03 2 views
1

Я имею эту простую функцию, которая берет на себя все запросы:Нужно ли мне закрыть DataReader

DataTable ReadIt(string query, params MySqlParameter[] sqlParams) 
{ 
    DataTable dt = new DataTable(); 

    using(MySqlConnection myConnection = new MySqlConnection(sConnection)) 
    { 
     myConnection.Open(); 
     MySqlCommand myCommand = myConnection.CreateCommand(); 
     myCommand.CommandText = query; 
     foreach (var p in sqlParams) 
     { 
      myCommand.Parameters.Add(p); 
     } 
     MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 
     dt.Load(myReader); 
     myReader.Close(); 
    } 

    return dt; 
} 

мне нужно поставить myReader.Close(); после загрузки данных в DataTable или же читатель закрывается автоматически после того, как Do using?

+4

Что использовать? Я не вижу использования, которое содержит читателя в качестве ресурса. – TomTom

+1

@TomTom Я думаю, что он означает, что он закрывается автоматически после блока 'use' для' MySqlConnection' –

+0

@ Корнуэлл, что «CommandBehavior.CloseConnect» предназначен для закрытия соединения, когда Reader закрыт, а не наоборот. В целом, это хорошая идея, чтобы убедиться, что вы закрываете/распоряжаетесь, когда закончите с ними. –

ответ

7

Вы не знаете (или, по крайней мере, не знаете), какие ресурсы хранит DataReader.
С другой стороны, каждый одноразовый объект должен быть удален, поскольку в распоряжающемся коде объект имеет возможность как можно скорее освободить используемые ресурсы.
Итак, ваш MySqlDataReader должен следовать тому же шаблону, который используется для MySqlConnection, а также для MySqlCommand. Использование себе ваш друг

using(MySqlConnection myConnection = new MySqlConnection(sConnection)) 
using(MySqlCommand myCommand = myConnection.CreateCommand()) 
{ 
    myConnection.Open(); 
    myCommand.CommandText = query; 
    foreach (var p in sqlParams) 
     myCommand.Parameters.Add(p); 
    using(MySqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)) 
    { 
     dt.Load(myReader); 
    } 
} 
+0

Я всегда закрываю объект для чтения данных. Но это лучшее решение. –

3

DataTable.Load автоматически закроет читателя если нет больше результата сетки. Это немного ударил и пропустил по моему вкусу; Я бы использовал using:

using(var myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)) { 
    dt.Load(myReader); 
} 
Смежные вопросы