Как подсчитать количество строк, возвращаемых в моем SQLite-ридере в С#?

Я работаю в Microsoft Visual С# 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, но мне действительно нужно знать счет раньше.

Любые предложения?

Ответ 1

DataReader работает лениво, поэтому перед его началом не добирается весь набор строк. Это оставляет вам два варианта:

  • Итерация и подсчет
  • Считать в инструкции SQL.

Поскольку я больше парень 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 (*) будет игнорировать полностью нулевые строки. Если у вас нет нулевого идентификатора, используйте count (id) (он немного быстрее, в зависимости от размера вашей таблицы).

Обновление: изменено на ExecuteScalar, а также count (id) на основе комментариев.

Ответ 2

Сделайте второй запрос:

cmd.CommandText = "select count(id) from myTable where word = '" + word + "';";
cmd.CommandType = CommandType.Text;
SQLiteDataReader reader = cmd.ExecuteReader();

Затем ваш читатель будет содержать одну строку с одним столбцом, содержащим количество строк в наборе результатов. Счет будет выполнен на сервере, поэтому он должен быть очень быстрым.

Ответ 3

То, что вы просите, не представляется возможным - процитировать Игорь Тандетник, мой акцент:

SQLite производит записи по одному, по запросу, каждый раз, когда вы вызываете sqlite3_step. Он просто не знает, сколько будет, пока на некотором sqlite3_stepзвоните, он обнаруживает, что их больше нет.

(sqlite3_step - это функция в API SQLite C, которую С#-интерфейс вызывает здесь для каждой строки в результате).

Вы можете скорее сделать "SELECT COUNT(*) from myTable where word = '" + word + "';", прежде чем ваш "реальный" запрос - это расскажет вам, сколько строк вы собираетесь получить из реального запроса.

Ответ 4

Если вы загружаете столбец id из базы данных, не проще ли просто загружать его в List<string>, а затем работать оттуда в памяти?

Ответ 5

но мне действительно нужно знать счет перед

Почему? это обычно не требуется, если вы используете адекватные структуры данных в памяти (Dataset, List...). Вероятно, есть способ сделать то, что вы хотите, чтобы не требовалось заранее считать строки.

Ответ 6

Обычно я делал

select count(1) from myTable where word = '" + word + "';";

чтобы получить результат как можно быстрее. В случае, когда id является int, это не будет иметь большого значения. Если бы это было нечто большее, чем тип строки, вы заметите разницу в большом наборе данных.

Рассуждение об этом count (1) будет содержать нулевые строки. Но я готов исправляться, если я ошибаюсь.

Ответ 7

Вам нужно рассчитывать с помощью select count... from...

Это сделает ваше приложение медленнее. Однако есть простой способ сделать ваше приложение быстрее, и этот способ использует параметризованные запросы.

Смотрите здесь: Как мне обойти "" " проблема в sqlite и С#?

(Таким образом, помимо параметризованных запросов скорости есть еще два преимущества).

Ответ 8

Попробуйте это,

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 дает вам количество строк в наборе результатов после обработки запроса

помните, что если вы хотите использовать одного и того же читателя, закройте это устройство и запустите его снова.

Ответ 9

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++;
       }

Ответ 10

Конечно, лучший способ получить количество строк будет следующим: -

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

...

    }

Таким образом, вам не нужно перебирать строки