Как подсчитать количество строк, возвращаемых в моем 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());
...
}
Таким образом, вам не нужно перебирать строки