我有以下代码从表中获取Count值:
string connStr =
@"Provider=Microsoft.ACE.OLEDB.12.0;User ID=NRBQBO;Password=NRBQCP;Data Source=C:CCRWinDATACCRDAT42.MDB;Jet OLEDB:System database=C:CCRWinDataNRBQ.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
…但(对我来说)如何得到这个值并不明显。当然有可能,但怎么做呢?
ExecuteScalar是你的朋友
int result = Convert.ToInt32(cmd.ExecuteScalar());
ExecuteScalar
返回结果集中第一行的第一列。
在本例中,只有一行和一个值。这对你来说是一个完美的场景。
还请注意,ExecuteScalar可能返回null,但在您的情况下,这个问题不存在,因为函数COUNT(*)
总是返回在可能的WHERE子句中匹配的记录计数,如果没有匹配的记录,则返回值将为0(而不是null)。
string connStr =
@"Provider=Microsoft.ACE.OLEDB.12.0;User ID=NRBQBO;Password=NRBQCP;Data Source=C:CCRWinDATACCRDAT42.MDB;Jet OLEDB:System database=C:CCRWinDataNRBQ.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());
}
}