我很清楚我应该这样做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以便它继续返回datareader?
我知道我可以使用数据表,但除了性能之外,这个方法在很多地方使用,所以如果它不断返回他现在返回的内容,我会节省很多时间。
答案 0 :(得分:2)
第一个修复是
SQLiteDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
这符合MSDN
执行命令时,关联的Connection对象是 关闭关联的DataReader对象时关闭。
当然,确保致电SQLiteDataReader.Close
至关重要。