0

我有这段代码用于从表中获取 Count 值:

string connStr =
    @"Provider=Microsoft.ACE.OLEDB.12.0;User ID=NRBQBO;Password=NRBQCP;Data Source=C:\CCRWin\DATA\CCRDAT42.MDB;Jet OLEDB:System database=C:\CCRWin\Data\NRBQ.mdw";

using (var conn = new OleDbConnection(connStr))
{
    using (OleDbCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = @"SELECT Count(*) FROM platypi";
        cmd.CommandType = CommandType.Text;
        conn.Open();

        int i = 0;

        using (OleDbDataReader oleDbD8aReader = cmd.ExecuteReader())
        {
            while (oleDbD8aReader != null && oleDbD8aReader.Read())
            {
                i++;
            }
        }
        return i;
    }

它有效,但我正在寻找一种方法来避免循环并简单地一举返回计数,例如:

. . .
using (OleDbDataReader oleDbD8aReader = cmd.ExecuteReader())
{
    if (oleDbD8aReader != null && oleDbD8aReader.Read())
    {
        i = oleDbD8aReader.Value;
    }
}
return i;
. . . // 2B ||! 2B this. es la Frage

...但是(对我而言)如何获得该值并不明显。当然有可能,但是怎么做呢?

4

1 回答 1

3

在这种情况下, ExecuteScalar是你的朋友

 int result = Convert.ToInt32(cmd.ExecuteScalar());

ExecuteScalar返回结果集中第一行的第一列。
在这种情况下,您只有一行只有一个值。所以这对你来说是一个完美的场景。

另请注意 ExecuteScalar 可能返回 null,但在您的情况下,此问题不存在,因为该函数COUNT(*)始终返回在可能的 WHERE 子句中匹配的记录计数,如果没有匹配的记录,则返回值为 0(不为空)。

所以你的代码就变成了

string connStr =
    @"Provider=Microsoft.ACE.OLEDB.12.0;User ID=NRBQBO;Password=NRBQCP;Data Source=C:\CCRWin\DATA\CCRDAT42.MDB;Jet OLEDB:System database=C:\CCRWin\Data\NRBQ.mdw";

using (var conn = new OleDbConnection(connStr))
{
    using (OleDbCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = @"SELECT Count(*) FROM platypi";
        // Not needed, Text is the default 
        // cmd.CommandType = CommandType.Text;
        conn.Open();

        int i = Convert.ToInt32(cmd.ExecuteScalar());
    }
}
于 2014-06-26T17:07:53.313 回答