PHP и MS Access: количество записей, возвращаемых запросом SELECT - PullRequest
3 голосов
/ 24 сентября 2008

Я выполняю следующий код PHP для взаимодействия с базой данных MS Access.

$odbc_con = new COM("ADODB.Connection");
$constr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . $db_path . ";";
$odbc_con -> open($constr);

$rs_select = $odbc_con -> execute ("SELECT * FROM Main");

Использование ($rs_select -> RecordCount) дает -1, хотя запрос возвращает ненулевые записи.

(а) В чем может быть причина? (б) Есть ли выход?

Я также пытался использовать count($rs_select -> GetRows()). Это удовлетворяет потребность, но выглядит неэффективно, так как сначала потребуется скопировать все записи в массив.

Ответы [ 5 ]

1 голос
/ 25 сентября 2008

ADODB имеет свои собственные правила для количества возвращаемых записей в зависимости от типа набора записей, который вы определили. См:

Статья базы знаний MS 194973

W3C Schools article

В приведенном выше примере объект PHP COM () используется для создания экземпляра ADODB, интерфейса COM для общего доступа к базе данных. Согласно документации PHP , созданная ссылка на объект перегружена, так что вы можете просто использовать те же свойства / методы, которые будут иметь нативный объект ADODB. Это означает, что вам нужно использовать методы ADODB, чтобы установить тип набора записей, который даст точный счет записи (если он вам нужен). Альтернатива, как уже упоминалось, состоит в использовании второго запроса для получения COUNT () записей, возвращаемых оператором SELECT. Это проще, но может быть неуместно в конкретной среде.

Я не гуру ADO, поэтому не могу предоставить вам точные команды для установки типа набора записей, но из приведенных выше статей ясно, что вам нужен статический курсор или курсор набора клавиш. Мне кажется, что правильным способом установки CursorType является использование параметра в команде, которая открывает набор записей. В этой статье W3C Schools о свойстве CursorType приведены соответствующие аргументы для этой команды.

Надеюсь, эта информация поможет оригинальному постеру выполнить то или иное задание.

1 голос
/ 24 сентября 2008

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

Как сказал Оли, использование SELECT COUNT(*) даст вам результат. Я думаю, что использование двух запросов все равно будет более эффективным, чем использование моего первого метода.

0 голосов
/ 25 сентября 2008

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

http://support.microsoft.com/kb/194973

0 голосов
/ 24 сентября 2008

По сути, Access не будет показывать вам весь набор записей до тех пор, пока в этом нет необходимости (в любом случае, это быстрее для большинства пользователей) - особенно для больших наборов записей.

Чтобы получить точный счет, вы должны пройти весь набор записей. В VBA я обычно делаю это с дуэтом foo.MoveLast и foo.MoveFirst - я не знаю, каковы эквиваленты php. Это дорого, но так как кажется, что вы все равно будете обрабатывать весь набор записей, я думаю, это нормально.

(примечание: этот же обход необходим и при работе с закладками в VBA, поскольку вы можете получить некоторые дикие результаты, если клонируете набор записей и не пересекаете его, прежде чем скопировать закладку обратно в набор записей формы). )

0 голосов
/ 24 сентября 2008

Разве Access не имеет своего собственного оператора COUNT? например:

$rs_select = $odbc_con -> execute ("SELECT COUNT(*) FROM Main");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...