Pregunta

Estoy usando pyodbc, a través de Microsoft Jet, para acceder a los datos en una base de datos de Microsoft Access 2003 desde un programa de Python.

La base de datos de Microsoft Access proviene de un tercero; Sólo estoy leyendo los datos.

En general, he tenido éxito en extraer los datos que necesito, pero recientemente noté algunas discrepancias.

Lo he reducido a una simple consulta, de la forma:

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

He confundido los nombres de campo y los valores, pero en realidad, ¡no hay nada más trivial que eso! Cuando ejecuto la consulta en Access, devuelve un registro.

Luego lo ejecuto en pyodbc, con un código que se ve así:

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

(De nuevo, ¡no se vuelve mucho más trivial que eso!)

El valor de queryString se corta y pega de la consulta de trabajo en Access, pero devuelve los registros no . Esperaba que volviera el mismo registro.

Cuando cambio la consulta para buscar un valor diferente para field2, bingo, funciona. Solo se rechazan algunos valores.

Por favor, ayúdame. ¿Dónde debería estar mirando a continuación para explicar esta discrepancia? Si no puedo confiar en los resultados de consultas triviales, ¡no tengo oportunidad en este proyecto!

Actualización : ¡Se vuelve aún más simple! La siguiente consulta da diferentes números ...

SELECCIONAR CUENTA (*) DE la tabla

Considero que está relacionado con alguna forma de almacenamiento en caché y / o gestión de transacciones inadecuada por otra aplicación que ocasionalmente llena los datos.

¿Fue útil?

Solución 5

El problema se resolvió en algún lugar entre una actualización a Access 2007 y la descarga de una copia nueva de la base de datos desde la fuente. Aún no sé cuál fue la causa raíz, pero sospecha de algún tipo de corrupción del índice.

Otros consejos

¿Puede darnos una base de datos confusa que muestre este problema? Nunca he experimentado esto. Al menos indique las definiciones de la tabla: ¿hay alguna de las columnas flotantes o decimales?

Esto puede sonar estúpido. Pero ...

Es la ruta a la base de datos real & amp; ¿La cadena de conexión (DSN) apunta a la misma ubicación de archivo?

¿Tiene el mismo problema con otras herramientas ODBC, por ejemplo, Herramienta de consulta ? También puede activar el seguimiento ODBC en el Administrador de conexión ODBC. No tengo acceso y no sé si se rastrearán sus comandos sql pero a veces me ayuda a resolver problemas de ODBC.

¿Están indexados los campos? Si es así, tal vez uno de los índices está dañado y necesita compactar el archivo MDB. Si un índice está dañado, puede dar lugar a problemas importantes. Podría perder relaciones existentes (si el índice corrupto es el PK), o podría perder datos. Así que necesitas tener una copia de seguridad antes de hacer esto. Si hay un índice dañado, creo que la operación compacta interactiva de Access te lo dirá, pero si no, puedes buscar la tabla MSysCompactErrors que te dirá qué errores ocurrieron durante la compilación.

Esto sucede muy raramente y puede indicar una de dos cosas:

  1. mal diseño de la aplicación, incluidas versiones obsoletas de Jet (Jet 4 antes del service pack 6 era muy susceptible a esto, y ahí es donde lo encontré).

  2. entorno operativo no confiable (redes / hardware / software).

Por supuesto, esta sugerencia es una posibilidad real, pero definitivamente es una causa de resultados diferentes (lo más común sería ORDER BY en el índice corrupto y terminará con un número de registros diferente al de otro). ORDENAR POR).

Supongo que el problema puede ser que no confirmó la consulta. PYODBC comienza con autocommit = False y, por lo tanto, todas las consultas, como seleccionar, insertar, actualizar, etc., iniciarán una transacción que, para que surta efecto, debe realizarla. Llame a connection.autocommit = True o llame a cursor.execute (" commit ") después de la consulta y luego fetchall.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top