如何计算C#中SQLite阅读器中返回的行数?
我正在使用Microsoft Visual C#2008 Express和SQLite。如何计算C#中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(*)只会忽略完全为空的行。如果你没有空ID,那么使用count(id)(根据你的表大小,它有点快)。
更新:更改为ExecuteScalar,并根据注释计数(id)。
做了第二次查询:然后
cmd.CommandText = "select count(id) from myTable where word = '" + word + "';"; cmd.CommandType = CommandType.Text; SQLiteDataReader reader = cmd.ExecuteReader();
你的读者会包含一个单行包含一列的行数的结果集。计数将在服务器上执行,所以它应该很快。
要小心计数单个字段:如果它为空,则不会被计数,但会被返回。确保一个字段在计数中使用之前有一个NOT NULL约束。 – Eric 2009-06-07 15:08:04
对于计数,您应该使用ExecuteScalar比ExecuteReader ... – 2009-06-07 15:09:12
绝对如此。通常,我希望一个名为“id”的字段不是NULL,但你永远无法确定! – 2009-06-07 15:09:58
你要求什么是不可行的 - 引用Igor Tandetnik,我的重点:
SQLite的生产记录,一个接一个,根据要求,每次调用
sqlite3_step
时间。 它根本不知道有多少将会是,直到一些sqlite3_step
称它发现没有更多。
(sqlite3_step
是SQLite的C API中的函数,C#接口在此调用结果中的每一行)。
你可以先做一个"SELECT COUNT(*) from myTable where word = '" + word + "';"
,然后你的“真实”查询 - 会告诉你你将从真实查询中得到多少行。
,但我真的需要知道
这是为什么之前计数?如果使用足够的内存数据结构(数据集,列表...),通常不需要这样做。可能有一种方法可以做到您想要的,而不需要事先对行进行计数。
我想实现这里定义的“graphmaster”的版本:http://www.alicebot.org/documentation/matching.html基本上 - 如果有0或1行,我有一个唯一的答案,没有后顾之忧。但是如果有两行或更多行,那么我必须做一些其他的事情来确定哪一个是正确的答案......并且取决于我的“图形”中的下一个节点。这是尽可能最好的,我可以在评论中发表意见! :) – adeena 2009-06-07 15:44:55
您可以检索列表或DataSet中的所有行,然后根据行数检查行数并根据内存中的数据执行任何操作。除非查询可能会获取数百或数千行,否则这应该不成问题。 – 2009-06-07 15:57:04
通常我会做
select count(1) from myTable where word = '" + word + "';";
以尽可能快的得到的结果。在id是int的情况下,它不会有太大的区别。如果它像一个字符串类型那么大一点,那么你会注意到一个大数据集的差异。
推理它计数(1)将包括空行。但是如果我错了,我准备好纠正。
你有select count... from...
这算将使您的应用程序速度较慢。但是,有一种简单的方法可以使您的应用程序更快速,而且这种方式正在使用参数化查询。
在这里看到:How do I get around the "'" problem in sqlite and c#?
(因此,除了速度参数化查询有其他优点2了。)
试试这个,
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++;
}
请为此代码添加一些解释来帮助OP。这将有助于提供未来观众可以从中学习的答案。有关更多信息,请参阅[答案]。当回答这样的老问题时,特别重要的是要区分你的答案和其他已有的答案。 – 2017-01-31 22:01:22
当然更好的办法让行数将是这样的: -
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());
...
}
这样,你就不必遍历行
是的 - 你的回应和杰里米之间的这将会起作用。虽然“myTable”最终会非常大,但是返回的行数可能总是很小 - 比10小,而且通常只会是0-2。谢谢! – adeena 2009-06-07 15:09:24
哦 - 和“ID”永远不会为空。如果是的话,还有其他的错误。 :) – adeena 2009-06-07 15:10:19
“非常大”有多大,你确定SQLite是最好的吗? – Eric 2009-06-07 15:10:54