2013-05-10 5 views
3

Im хорошо известно, что я должен сделать запрос SELECT, как этот:С # с System.Data.SQLite - закрытие соединения

System.Data.SQLite.SQLiteConnection scrsql_con = new System.Data.SQLite.SQLiteConnection("Data Source=db.db;Version=3;New=False;Compress=True;"); 
scrsql_con.Open(); 
SQLiteCommand cmd = new SQLiteCommand(); 
cmd.CommandText = "Select something FROM something"; 
cmd.Connection = scrsql_con; 
SQLiteDataReader dr = cmd.ExecuteReader(); 
//reading stuff from datareader... 
dr.Close(); 
scrsql_con.Close(); 

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

public static SQLiteDataReader GenericSelect(String query) 
{ 
     System.Data.SQLite.SQLiteConnection scrsql_con = new System.Data.SQLite.SQLiteConnection("Data Source=SCRdb.db;Version=3;New=False;Compress=True;"); 
     scrsql_con.Open(); 
     SQLiteCommand cmd = new SQLiteCommand(); 
     cmd.CommandText = query; 
     cmd.Connection = scrsql_con; 
     SQLiteDataReader dr = cmd.ExecuteReader(); 
     return dr; 
} 

Но его не очень хорошо, так как он оставляет scrsql_con hanging.I не может закрыть его изнутри метода GenericSelect, потому что это означает, что он всегда будет возвращать пустой DataReader или ошибка, и я не могу закрыть ее извне. Любые предложения, как я должен делать GenericSelect правильно, чтобы он продолжал возвращать datareader?

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

+0

Ваш метод GenericSelect является «статическим», поэтому ваше соединение создается и уничтожается каждый раз, когда вы вызываете этот метод. – banging

+1

Почему вы не возвращаете DataTable? – banging

+0

Потому что ему нужно изменить каждую процедуру, которая вызывает GenericSelect? Потому что заполнение DataTable, а затем цикл, что эффективно удваивает хиты производительности? – Steve

ответ

2

Первое исправление

SQLiteDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

и это в соответствии с MSDN

Когда команда выполнена, связанный объект Подключение закрыт, когда связанный объект DataReader закрывается.

Конечно, сейчас важно, чтобы позвонить по телефону SQLiteDataReader.Close.

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