Frage

Ich bin mit Pyodbc über Microsoft Jet, die Daten in einer Microsoft Access 2003-Datenbank von einem Python-Programm zugreifen zu können.

Die Microsoft Access-Datenbank stammt aus einem Dritt; Ich bin nur die Daten zu lesen.

Ich habe im Allgemeinen Erfolg wurde mit der Daten zu extrahieren ich brauche, aber ich bemerkte vor kurzem einige Unstimmigkeiten.

Ich habe es gekocht auf eine einfache Abfrage, die Form:

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

Ich habe die Feldnamen und Werte verschleiert aber wirklich, wird es nicht viel mehr trivial als das! Wenn ich die Abfrage in Access ausführen, gibt es einen Datensatz.

Dann laufe ich es über Pyodbc, mit Code, der wie folgt aussieht:

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

(Auch hier ist es nicht viel mehr trivial bekommen als das!)

Der Wert von querystring ist Ausschneiden und Einfügen von der Arbeits Abfrage in Access, aber es gibt keine Aufzeichnungen. Ich erwartete sie denselben Datensatz zurückzukehren.

Wenn ich die Abfrage ändern, um einen anderen Wert für field2, Bingo zu suchen, es funktioniert. Es ist nur einige Werte, die es ablehnt.

Also, bitte helfen Sie mir. Wo soll ich als nächstes suchen, um diese Diskrepanz zu erklären? Wenn ich nicht den Ergebnissen der trivialen Anfragen vertrauen kann, ich habe keine Chance, an diesem Projekt habe!

Update : Es wird noch einfacher! Die folgende Abfrage gibt verschiedene Zahlen ...

SELECT COUNT (*) FROM table

ich darüber nachzudenken, ob es zu irgendeiner Form von Caching und / oder unsachgemäßen Transaktionsmanagement von einer anderen Anwendung verwendet ist, die gelegentlich die Daten auffüllt.

War es hilfreich?

Lösung 5

Das Problem war irgendwo zwischen einem Upgrade auf Access 2007 und das Herunterladen eine neue Kopie der Datenbank aus der Quelle gelöst. Sie wissen immer noch nicht, was die Ursache war, aber eine Form der Index Korruption vermuten.

Andere Tipps

können Sie uns eine verschleierte Datenbank geben, die dieses Problem zeigt? Ich habe noch nie erlebt. Zumindest die Tabellendefinitionen gibt - ist eine der Säulen schwimmt oder dezimal

?

Das klingt vielleicht dumm. Aber ...

Ist der Weg zur tatsächlichen Datenbank-Verbindungszeichenfolge (DSN) verweist auf gleichen Dateipfad?

Haben Sie das gleiche Problem mit anderen ODBC-Tool, zum Beispiel Query Tool ? Sie können sich auf ODBC-Ablaufverfolgung in ODBC-Connection Manager schalten auch. Ich habe keinen Zugriff und weiß nicht, ob seine SQL-Befehle zurückverfolgt werden, aber manchmal hilft es mir ODBC Probleme zu lösen.

Sind indiziert die Felder? Wenn ja, ist vielleicht einer der Indizes beschädigt und Sie müssen die MDB-Datei komprimieren. Wenn ein Index ist beschädigt, kann es zu großen Problemen führen. Sie könnten bestehende Beziehungen verlieren (wenn der korrupte Index der PK ist), oder Sie können Daten verloren gehen. So müssen Sie eine Sicherungskopie haben, bevor Sie dies tun. Wenn es ein beschädigter Index ist, denke ich, der interaktiven Zugang kompakte Betrieb werden Ihnen sagen, aber wenn nicht, können Sie für die MSysCompactErrors Tabelle sehen, die Sie sagen, was Fehler bei den kompakten aufgetreten.

Dies geschieht nur sehr selten und kann eines von zwei Dingen an:

  1. schlechtes Anwendungsdesign, einschließlich veraltete Jet-Versionen (Jet 4 vor dem Service Pack 6 war sehr anfällig für diesen, und das ist, wo ich es begegnet).

  2. unzuverlässige Betriebsumgebung (Vernetzung / Hardware / Software).

Natürlich ist dieser Vorschlag ein echter Totalen, aber es ist auf jeden Fall eine Ursache für unterschiedliche Ergebnisse (die häufigste wäre auf dem beschädigten Index ORDER BY und Sie werden mit einer anderen Datenanzahl am Ende als mit einem anderen ORDER BY).

Ich denke, das Problem kann sein, dass Sie die Abfrage nicht begangen hat. Pyodbc beginnt mit autocommit = False und damit jede Abfrage wie Auswählen, Einfügen, Aktualisieren usw. wird eine Transaktion starten, dass, um Effekt, den Sie zu begehen zu erreichen. Entweder connection.autocommit = True anrufen oder cursor.execute("commit") nach der Abfrage aufrufen und dann fetchall.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top