3

我很清楚我应该这样做 SELECT 查询:

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 挂起。我无法从 GenericSelect 方法内部关闭它,因为这意味着它总是会返回空的 datareader 或错误,我无法从外部关闭它。有什么建议我应该如何正确执行 GenericSelect 以便它不断返回数据读取器?

我知道我可以使用数据表,但是除了性能之外,这种方法在很多地方都有使用,所以如果它一直返回他现在返回的内容,我会节省很多时间。

4

1 回答 1

2

第一个修复是

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

这根据MSDN

执行命令时,关闭关联的 DataReader 对象时,关闭关联的 Connection 对象。

当然,现在最重要的是一定要打电话SQLiteDataReader.Close

于 2013-05-10T19:25:19.097 回答