我正在使用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语句中添加一个计数,但我真的需要知道计数。
有什么建议吗?
答案 0 :(得分:26)
DataReader延迟运行,因此在开始之前它不会获取整个行集。这为您留下了两个选择:
因为我更像是一个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)。
答案 1 :(得分:2)
再做一次查询:
cmd.CommandText = "select count(id) from myTable where word = '" + word + "';"; cmd.CommandType = CommandType.Text; SQLiteDataReader reader = cmd.ExecuteReader();
然后,您的阅读器将包含一行,其中一列包含结果集中的行数。计数将在服务器上执行,因此它应该非常快。
答案 2 :(得分:2)
你要求的是不可行的 - 引用Igor Tandetnik,我的重点:
每次调用
sqlite3_step
时,SQLite都会根据请求逐个生成记录。 它只是不知道会有多少,直到某些sqlite3_step
叫它发现没有更多。
(sqlite3_step
是SQLite的C API中的函数,C#接口在此处为结果中的每一行调用。)
您可能首先在“真实”查询之前先执行"SELECT COUNT(*) from myTable where word = '" + word + "';"
- 将告诉您实际查询将获得多少行。
答案 3 :(得分:1)
如果您只是从数据库中加载id
列,那么简单地加载到List<string>
然后在内存中工作就不容易了吗?
答案 4 :(得分:1)
通常我会这样做
select count(1) from myTable where word = '" + word + "';";
尽快获得结果。在id是int的情况下,它不会有太大的区别。如果它像字符串类型那样大一点,那么你会注意到大数据集的差异。
关于count(1)的推理将包括空行。但如果我错了,我准备纠正。
答案 5 :(得分:0)
但我真的需要知道计数
为什么?如果您使用足够的内存数据结构(数据集,列表...),通常不需要这样做。可能有一种方法可以做你想要的事情,而不需要事先计算行数。
答案 6 :(得分:0)
您必须使用select count... from...
这会使您的应用程序变慢。但是,有一种简单的方法可以使您的应用程序更快,这种方式是使用参数化查询。
见这里:How do I get around the "'" problem in sqlite and c#?
(除了速度参数化查询还有其他两个优点。)
答案 7 :(得分:0)
试试这个,
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在处理查询
后为您提供结果集中的行数请记住,如果您想使用相同的阅读器,请关闭此阅读器并重新启动。
答案 8 :(得分:0)
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++;
}
答案 9 :(得分:0)
当然,获得行数的更好方法是这样的: -
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());
...
}
这样你就不必遍历行
答案 10 :(得分:0)
这是我在静态方法中的完整实现。 您应该可以将此插入到您的类中(用数据库文件名和表名替换_STR_DB_FILENAME和STR_TABLE_NAME)。
/// <summary>
/// Returns a count of the number of items in the database.
/// </summary>
/// <returns></returns>
public static int GetNumberOfItemsInDB()
{
// Initialize the count variable to be returned
int count = 0;
// Start connection to db
using (SqliteConnection db =
new SqliteConnection("Filename=" + _STR_DB_FILENAME))
{
// open connection
db.Open();
SqliteCommand queryCommand = new SqliteCommand();
queryCommand.Connection = db;
// Use parameterized query to prevent SQL injection attacks
queryCommand.CommandText = "SELECT COUNT(*) FROM " + _STR_TABLE_NAME;
// Execute command and convert response to Int
count = Convert.ToInt32(queryCommand.ExecuteScalar());
// Close connection
db.Close();
}
// return result(count)
return count;
}
注意:为了提高性能,可以在“ SELECT COUNT()…”中替换“ ”。与表中主键的列名配合使用,可在较大的数据集上更快地获得性能。