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結果セットの最初の行の最初の列を返します。
この場合、値が 1 つだけの行が 1 つだけあります。したがって、これはあなたにとって完璧なシナリオです。

また、ExecuteScalar は null を返す可能性があることにも注意してください。ただし、関数COUNT(*)は可能な WHERE 句で一致するレコードの数を常に返し、一致するレコードがない場合、戻り値は 0 になるため、この問題は存在しません ( null ではない)。

だからあなたのコードはただになります

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 に答える