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

  1. 迭代并计算
  2. 算在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()); ... } 

这样您就不必遍历行