如何计算C#中我的SQLite阅读器中返回的行数?

时间:2009-06-07 14:59:08

标签: 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语句中添加一个计数,但我真的需要知道计数。

有什么建议吗?

11 个答案:

答案 0 :(得分:26)

DataReader延迟运行,因此在开始之前它不会获取整个行集。这为您留下了两个选择:

  1. 迭代并计算
  2. 计入SQL语句。
  3. 因为我更像是一个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()…”中替换“ ”。与表中主键的列名配合使用,可在较大的数据集上更快地获得性能。