如何计算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延迟运行,因此在开始之前它不会拾取整个行集。这使你有两个选择:

  1. 通过迭代计算,并在SQL语句中
  2. 计数。

因为我更多的是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)。

+0

是的 - 你的回应和杰里米之间的这将会起作用。虽然“myTable”最终会非常大,但是返回的行数可能总是很小 - 比10小,而且通常只会是0-2。谢谢! – adeena 2009-06-07 15:09:24

+3

哦 - 和“ID”永远不会为空。如果是的话,还有其他的错误。 :) – adeena 2009-06-07 15:10:19

+0

“非常大”有多大,你确定SQLite是最好的吗? – Eric 2009-06-07 15:10:54

做了第二次查询:然后

 
cmd.CommandText = "select count(id) from myTable where word = '" + word + "';"; 
cmd.CommandType = CommandType.Text; 
SQLiteDataReader reader = cmd.ExecuteReader(); 

你的读者会包含一个单行包含一列的行数的结果集。计数将在服务器上执行,所以它应该很快。

+0

要小心计数单个字段:如果它为空,则不会被计数,但会被返回。确保一个字段在计数中使用之前有一个NOT NULL约束。 – Eric 2009-06-07 15:08:04

+4

对于计数,您应该使用ExecuteScalar比ExecuteReader ... – 2009-06-07 15:09:12

+0

绝对如此。通常,我希望一个名为“id”的字段不是NULL,但你永远无法确定! – 2009-06-07 15:09:58

如果你只是从数据库中加载一个id列,简单地加载到List<string>然后在内存中从那里工作会不会更容易?

+0

如果你考虑表中有几十万行的情况,这可能不是你想要做的。更好地提前运行另一个查询来查找行集的数量。 – 2009-06-07 15:11:24

+0

这取决于'我在这里做什么'是...取决于算法大多数/所有的数据可能最终在内存中无论如何。 – jerryjvl 2009-06-07 15:14:56

+0

另请注意,在另一条评论中,提交者指示查询中通常会显示类似10行的内容,因此使用列表可能会比数据库的两次往返更快。 – jerryjvl 2009-06-07 15:16:35

你要求什么是不可行的 - 引用Igor Tandetnik,我的重点:

SQLite的生产记录,一个接一个,根据要求,每次调用sqlite3_step时间。 它根本不知道有多少将会是,直到一些sqlite3_step 称它发现没有更多。

sqlite3_step是SQLite的C API中的函数,C#接口在此调用结果中的每一行)。

你可以先做一个"SELECT COUNT(*) from myTable where word = '" + word + "';",然后你的“真实”查询 - 会告诉你你将从真实查询​​中得到多少行。

,但我真的需要知道

这是为什么之前计数?如果使用足够的内存数据结构(数据集,列表...),通常不需要这样做。可能有一种方法可以做到您想要的,而不需要事先对行进行计数。

+0

我想实现这里定义的“graphmaster”的版本:http://www.alicebot.org/documentation/matching.html基本上 - 如果有0或1行,我有一个唯一的答案,没有后顾之忧。但是如果有两行或更多行,那么我必须做一些其他的事情来确定哪一个是正确的答案......并且取决于我的“图形”中的下一个节点。这是尽可能最好的,我可以在评论中发表意见! :) – adeena 2009-06-07 15:44:55

+0

您可以检索列表或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++; 
     } 
+2

请为此代码添加一些解释来帮助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()); 

... 

    } 

这样,你就不必遍历行