Как я считаю количество строк возвращенным в моем читателе SQLite в C#?

Я тоже хотел бы найти правильное и нативное решение этого вопроса, проверяя только коммиты на одной ветви и, таким образом, «обвиняя» весь запрос на слияние и / или извлечение. Однако:

, поскольку коммиты главной ветки являются единственными (предположительно) стабильными, я хочу сделать git bisect только на этой ветке.

Если проблема, вызывающая этот вопрос, заключается в том, что некоторые коммиты, которые вам дают, нарушены и вы не можете их протестировать, вы можете использовать:

git bisect skip

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

Полагаю, вы могли бы git bisect skip ВСЕ коммиты, которые не являются слияниями, либо проверять вручную, либо с помощью скрипта. Это дало бы поведение, заданное в вопросе.

11
задан Bart 7 March 2013 в 10:38
поделиться

7 ответов

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

  1. Итерация и подсчет
  2. Подсчет в операторе 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) на основе комментариев.

26
ответ дан 3 December 2019 в 02:20
поделиться

То, что вы запрашиваете, неосуществимо - процитирую Игоря Тандетника , мой акцент:

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

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

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

3
ответ дан 3 December 2019 в 02:20
поделиться

Выполните второй запрос:

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

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

2
ответ дан 3 December 2019 в 02:20
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 02:20
поделиться

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

1
ответ дан 3 December 2019 в 02:20
поделиться

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

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

0
ответ дан 3 December 2019 в 02:20
поделиться

Вы должны считать с select count ... from. ..

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

См. Здесь: Как обойти проблему "'" в sqlite и c #?

(Так что помимо скорости параметризованные запросы имеют еще два преимущества.)

0
ответ дан 3 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: