Domanda

Sto usando pyodbc, tramite Microsoft Jet, per accedere ai dati in un database Microsoft Access 2003 da un programma Python.

Il database di Microsoft Access proviene da una terza parte; Sto solo leggendo i dati.

In genere ho avuto successo nell'estrarre i dati di cui ho bisogno, ma recentemente ho notato alcune discrepanze.

L'ho ridotto a una semplice query, nel formato:

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

Ho offuscato i nomi e i valori dei campi, ma in realtà non è molto più banale di così! Quando eseguo la query in Access, restituisce un record.

Quindi lo eseguo su pyodbc, con un codice simile al seguente:

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

(Ancora una volta, non diventa molto più banale di così!)

Il valore di queryString viene tagliato e incollato dalla query di lavoro in Access, ma restituisce no record. Mi aspettavo che restituisse lo stesso record.

Quando cambio la query per cercare un valore diverso per field2, bingo, funziona. È solo alcuni dei valori che rifiuta.

Quindi, per favore, aiutatemi. Dove dovrei guardare accanto per spiegare questa discrepanza? Se non posso fidarmi dei risultati di domande banali, non ho alcuna possibilità su questo progetto!

Aggiorna : diventa ancora più semplice! La seguente query fornisce numeri diversi ...

SELEZIONA COUNT (*) DA tabella

Medito se è correlato a una qualche forma di memorizzazione nella cache e / o gestione impropria delle transazioni da parte di un'altra applicazione che occasionalmente popola i dati.

È stato utile?

Soluzione 5

Il problema è stato risolto da qualche parte tra un aggiornamento ad Access 2007 e il download di una nuova copia del database dall'origine. Non so ancora quale fosse la causa principale, ma sospetti una qualche forma di corruzione dell'indice.

Altri suggerimenti

puoi darci un database offuscato che mostra questo problema? Non l'ho mai provato. Almeno fornire le definizioni della tabella - c'è una delle colonne float o decimali?

Potrebbe sembrare stupido. Ma ...

È il percorso del database & amp; stringa di connessione (DSN) punta allo stesso percorso del file?

Hai lo stesso problema con altri strumenti ODBC, ad esempio Strumento di query ? È inoltre possibile attivare la traccia ODBC in ODBC Connection Manager. Non ho accesso e non so se verranno tracciati i suoi comandi sql ma a volte mi aiuta a risolvere i problemi ODBC.

I campi sono indicizzati? In tal caso, forse uno degli indici è danneggiato ed è necessario compattare il file MDB. Se un indice è danneggiato, può causare gravi problemi. Potresti perdere le relazioni esistenti (se l'indice corrotto è il PK) o potresti perdere i dati. Quindi è necessario disporre di un backup prima di farlo. Se c'è un indice corrotto, penso che l'operazione compatta di Access interattiva ti dirà, ma in caso contrario, puoi cercare la tabella MSysCompactErrors che ti dirà quali errori si sono verificati durante la compatta.

Ciò accade solo molto raramente e può indicare una delle due cose:

  1. progettazione di applicazioni errata, comprese versioni obsolete di Jet (Jet 4 prima del service pack 6 era molto sensibile a questo, ed è lì che l'ho incontrato).

  2. ambiente operativo inaffidabile (rete / hardware / software).

Naturalmente, questo suggerimento è un vero colpo lungo, ma è sicuramente una causa di risultati diversi (il più comune sarebbe ORDER BY sull'indice corrotto e si otterrà un conteggio dei record diverso rispetto a un altro ORDINA PER).

Suppongo che il problema potrebbe essere che non hai eseguito il commit della query. PYODBC inizia con autocommit = False e quindi ogni query come selezionare, inserire, aggiornare, ecc. Avvierà una transazione che per ottenere l'effetto devi impegnarti. Chiama connection.autocommit = True o chiama cursor.execute (" commit ") dopo la query e quindi fetchall.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top