Как я могу отключить эту функцию подсчета записей?

#c# #ms-access-2007 #oledbconnection #oledbcommand #oledbdatareader

#c# #ms-access-2007 #oledbconnection #oledbcommand #oledbdatareader

Вопрос:

У меня есть этот код для получения значения счетчика из таблицы:

 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 amp;amp; oleDbD8aReader.Read())
            {
                i  ;
            }
        }
        return i;
    }
 

Это работает, но я ищу способ избежать цикла и просто вернуть счетчик одним махом, например:

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

… но не очевидно (для меня), как получить это значение. Конечно, это возможно, но как?

Комментарии:

1. Если вы не отредактировали этот код перед публикацией, я не думаю, что этот код будет делать то, что вы и другие считаете логическим, поэтому его замена изменит его. Как указано выше, этот код всегда будет возвращать 1, потому что он выполняет цикл по результирующему набору и поддерживает счетчик, а в результирующем наборе всегда будет только одна строка с одним столбцом, который он фактически не читает.

Ответ №1:

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());
    }
}
 

Комментарии:

1. Этот способ не только проще, но и намного эффективнее. Это позволяет избежать необходимости возвращать всю таблицу данных только для получения количества записей.