2009-05-06 5 views
3

Я использую pyobbc через Microsoft Jet для доступа к данным в базе данных Microsoft Access 2003 из программы Python.PyODBC и Microsoft Access: непоследовательные результаты из простого запроса

База данных Microsoft Access поступает от стороннего производителя; Я только читаю данные.

У меня, как правило, был успех в извлечении необходимых мне данных, но я недавно заметил некоторые несоответствия.

Я варил до простого запроса, формы:

SELECT field1 FROM table WHERE field1 = 601 AND field2 = 9067 

Я запутывания имена полей и значения, но на самом деле, это не становится намного более тривиальным, чем это! Когда я запускаю запрос в Access, он возвращает одну запись.

Затем я запускаю его над pyodbc, с кодом, который выглядит следующим образом:

connection = pyodbc.connect(connectionString) 
rows = connection.execute(queryString).fetchall() 

(Опять же, это не становится намного более тривиальным, чем это!)

Значение QueryString режется -and-ined из рабочего запроса в Access, но он возвращает no записей. Я ожидал, что он вернет ту же запись.

Когда я меняю запрос на поиск другого значения для field2, bingo, он работает. Это лишь некоторые ценности, которые он отвергает.

Итак, пожалуйста, помогите мне. Где я должен смотреть рядом, чтобы объяснить это несоответствие? Если я не могу доверять результатам тривиальных запросов, у меня нет шансов на этот проект!

Обновление: Это становится еще проще! Следующий запрос дает разные номера ...

SELECT COUNT (*) FROM таблицы

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

+0

Если у вас есть объект курсора для выполнения строки запроса? Затем Fetchall будет вызываться на курсоре для создания строк. См. Http://code.google.com/p/pyodbc/wiki/Rows – barrowc

+0

@barrowc, Интересно. Я не заметил отсутствие вызова курсора(). Я уверен, что я скопировал это из примера где-нибудь. Я попытался добавить его обратно в [rows = connection.cursor(). Execute (queryString) .fetchall()], но это не имело никакого значения - очевидно, pyodbc более прощает, чем спецификация API Python DB. – Oddthinking

ответ

1

Проблема была решена где-то между обновлением до Access 2007 и загрузкой новой копии базы данных из источника. Все еще не знаю, в чем была основная причина, но подозревают какую-то форму коррупции индекса.

1

Вы можете дать нам запутанную базу данных, которая показывает эту проблему? Я никогда не испытывал этого. По крайней мере, дать определения таблиц - есть ли какой-либо из столбцов, плавающих или десятичных?

+0

Я проголосовал за предложение проверить поплавки. Хорошее мышление, однако это не проблема, поскольку обновленная версия раскрывается без предложения WHERE. Я работаю над тем, как получить описание таблицы из Access для вас. – Oddthinking

1

Это может показаться глупым. Но ...

Является ли путь к фактической базе данных & строке соединения (DSN) указывает на то же местоположение файла?

+0

Это совершенно разумное предложение; Я действительно надеюсь, что это окажется чем-то таким же тривиальным! У меня проверено дважды, и оба они указывают на один и тот же каталог. Я видел, как Access 2003 запутался и, по-видимому, открыл недавний файл MDB, который с тех пор был удален, поэтому мне все еще интересно, есть ли здесь кеширование или подобное. – Oddthinking

+0

Является ли файл MDB по сетевому пути, который вы пытаетесь использовать с помощью приложения на базе python на компьютере? – shahkalpesh

1

У вас есть такая же проблема с другими инструментами ODBC, например Query Tool? Вы также можете включить трассировку ODBC в диспетчере соединений ODBC. У меня нет доступа и не знаю, будут ли отслеживаться его команды sql, но иногда это помогает мне решать проблемы ODBC.

+0

Я только что установил инструмент запросов. Я должен был указать источник данных по-другому (а не строку соединения). Я запустил «SELECT COUNT (*) FROM table». Это дало мне тот же ответ, что и мой код Python, и другой (меньший) ответ на тот же оператор в Access. Итак, хорошие новости, это не мой код Python или pyobbc. Плохая новость: я не могу доверять Access/ODBC. – Oddthinking

+0

Доступ - это действительно классный инструмент, но он глючит. Например, иногда, если вы пишете запрос в SQL и позже его отредактируете, он скажет вам, что у вас есть синтаксические ошибки, которые вы исправили, - вам нужно скопировать запрос в блокнот и вернуться в новый вид дизайна sql Access. Мне кажется, что доступ не становится лучше для меня, просто более запутанным и сложным. –

+0

Доступ ли в использовании в этом вопросе? Насколько я могу судить, используется только Jet, поэтому Access QBE не задействован. –

1

Отражены ли поля? Если это так, возможно, один из индексов поврежден, и вам необходимо сжать файл MDB. Если индекс является коррумпированным, это может привести к серьезным проблемам. Вы можете потерять существующие отношения (если поврежденный индекс является PK), или вы можете потерять данные. Поэтому вам нужно иметь резервную копию, прежде чем делать это.Если есть поврежденный индекс, я думаю, что интерактивная операция Access compact сообщит вам, но если нет, вы можете посмотреть таблицу MSysCompactErrors, которая сообщит вам, какие ошибки произошли во время компакт-диска.

Это происходит очень редко и может указывать на один из двух вещей:

  1. плохой дизайн приложений, в том числе устаревших версий Jet (Jet 4 до пакета обновления 6 была очень чувствительны к этому, и вот где я столкнулся Это).

  2. ненадежная операционная среда (сеть/аппаратное/программное обеспечение).

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

+0

Я проверю это. Мой первый шаг состоял в проверке моей версии JET. Я использую самую последнюю версию, которая поставляется с Vista Service Pack 1. (http://support.microsoft.com/kb/239114 была моей ссылкой.) – Oddthinking

1

Возможно, проблема заключается в том, что вы не сделали запрос. PYODBC начинается с autocommit = False, поэтому каждый запрос, например select, insert, update и т. Д., Начинает транзакцию, чтобы получить эффект, который вы должны выполнить. Либо вызовите connection.autocommit = True, либо вызовите cursor.execute("commit") после запроса, а затем fetchall.

+0

Вам даже нужно делать инструкции SELECT? –

+0

Я не знаю о Access Database, но если вы используете SQL Server, тогда havin autocommit = False означает наличие неявных транзакций. http://msdn.microsoft.com/en-us/library/ms188317.aspx заявляет, что даже SELECT запускает транзакцию. –

Смежные вопросы