如何计算C#中我的SQLite阅读器中返回的行数?
我正在使用Microsoft Visual C#2008 Express和SQLite。
我用这样的东西查询我的数据库:
SQLiteCommand cmd = new SQLiteCommand(conn); cmd.CommandText = "select id from myTable where word = '" + word + "';"; cmd.CommandType = CommandType.Text; SQLiteDataReader reader = cmd.ExecuteReader();
然后我做这样的事情:
if (reader.HasRows == true) { while (reader.Read()) { // I do stuff here } }
我想做的是在我执行“reader.Read()” 之前计算行数,因为返回的数字将影响我想要/需要做的事情。 我知道我可以在while语句中添加一个计数,但我真的需要知道计数。
有什么建议?
DataReader延迟运行,因此在开始之前它不会获取整个行集。 这有两个选择:
- 迭代并计算
- 算在SQL语句中。
因为我更像是一个SQL人,所以我会在SQL语句中进行计数:
cmd.CommandText = "select count(id) from myTable where word = '" + word + "';"; cmd.CommandType = CommandType.Text; int RowCount = 0; RowCount = Convert.ToInt32(cmd.ExecuteScalar()); cmd.CommandText = "select id from myTable where word = '" + word + "';"; SQLiteDataReader reader = cmd.ExecuteReader(); //...
注意我如何计算*,而不是开头的id。 这是因为count(id)将忽略id,而count(*)将只忽略完整的null行。 如果你没有空id,那么使用count(id)(它的速度稍微快一点,具体取决于你的表大小)。
更新:更改为ExecuteScalar,并根据注释计数(id)。
做第二个查询:
cmd.CommandText =“从myTable中选择count(id),其中word ='”+ word +“';”; cmd.CommandType = CommandType.Text; SQLiteDataReader reader = cmd.ExecuteReader();
然后,您的阅读器将包含一行,其中一列包含结果集中的行数。 计数将在服务器上执行,因此它应该非常快。
你要求的是不可行的 – 引用Igor Tandetnik ,我的重点是:
每次调用
sqlite3_step
时,SQLite都会根据请求逐个生成记录。 它根本不知道会有多少 ,直到在一些sqlite3_step
调用它发现它没有更多。
( sqlite3_step
是SQLite的C API中的函数,C#接口在此处为结果中的每一行调用)。
你可以"SELECT COUNT(*) from myTable where word = '" + word + "';"
做一个"SELECT COUNT(*) from myTable where word = '" + word + "';"
首先,在您的“真实”查询之前 – 这将告诉您将从真实查询中获得多少行。
如果您只是从数据库加载一个id
列,那么简单地加载到List
然后在内存中工作就不容易了吗?
通常我会这样做
select count(1) from myTable where word = '" + word + "';";
尽快获得结果。 在id是int的情况下,它将没有太大的区别。 如果它像字符串类型那样大一点,那么你会注意到大数据集的差异。
关于它的推理count(1)将包括空行。 但如果我错了,我准备纠正。
但我真的需要知道以前的数
这是为什么 ? 如果您使用足够的内存数据结构(数据集,列表…),通常不需要这样做。 可能有一种方法可以做你想要的事情,不需要事先计算行数。
你必须计算select count... from...
这将使您的应用程序变慢。 但是,有一种简单的方法可以使您的应用程序更快,这种方式是使用参数化查询。
看这里: 我如何解决sqlite和c#中的“’”问题?
(因此除了速度参数化查询还有其他两个优点。)
试试这个,
SQLiteCommand cmd = new SQLiteCommand(conn); cmd.CommandText = "select id from myTable where word = '" + word + "';"; SQLiteDataReader reader = cmd.ExecuteReader(); while (reader.HasRows) reader.Read(); int total_rows_in_resultset = reader.StepCount;
total_rows_in_resultset在处理查询后为您提供结果集中的行数
请记住,如果您想使用相同的阅读器,请关闭此阅读器并重新启动它。
SQLiteCommand cmd = new SQLiteCommand(conn); cmd.CommandText = "select id from myTable where word = '" + word + "';"; SQLiteDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { total_rows_in_resultset++; }
当然,获得行数的更好方法是这样的: –
SQLiteDataReader reader = SendReturnSQLCommand(dbConnection, "SELECT COUNT(*) AS rec_count FROM table WHERE field = 'some_value';"); if (reader.HasRows) { reader.Read(); int count = Convert.ToInt32(reader["rec_count"].ToString()); ... }
这样您就不必遍历行