문제

Microsoft Jet를 통해 PYODBC를 사용하여 Python 프로그램에서 Microsoft Access 2003 데이터베이스의 데이터에 액세스하고 있습니다.

Microsoft Access 데이터베이스는 타사에서 나옵니다. 데이터 만 읽고 있습니다.

나는 일반적으로 필요한 데이터를 추출하는 데 성공했지만 최근에는 몇 가지 불일치를 발견했습니다.

나는 그것을 양식의 간단한 쿼리로 끓였다.

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

나는 필드 이름과 가치를 난독 화했지만 실제로는 그보다 훨씬 더 사소하지 않습니다! 액세스에서 쿼리를 실행하면 한 레코드를 반환합니다.

그런 다음 PyoDBC를 통해 다음과 같이 보이는 코드로 실행합니다.

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

(다시, 그것은 그것보다 훨씬 더 사소하지 않습니다!)

QueryString의 값은 액세스중인 작업 쿼리에서 잘라 내고 포장되어 있지만 반환됩니다. 아니요 기록. 나는 그것이 같은 기록을 반환 할 것으로 예상했다.

쿼리를 변경하여 Field2, Bingo에 대한 다른 값을 검색하면 작동합니다. 거부하는 일부 값 일뿐입니다.

그러니 도와주세요. 이 불일치를 설명하기 위해 옆에 어디에서 찾아야합니까? 사소한 쿼리의 결과를 믿을 수 없다면이 프로젝트에 대한 기회가 없습니다!

업데이트: 훨씬 간단 해집니다! 다음 쿼리는 다른 숫자를 제공합니다 ...

테이블에서 count (*)를 선택하십시오

때때로 데이터를 채우는 다른 응용 프로그램에 의한 어떤 형태의 캐싱 및/또는 부적절한 거래 관리와 관련이 있는지 숙고합니다.

도움이 되었습니까?

해결책 5

Access 2007으로의 업그레이드와 소스에서 새로운 데이터베이스 사본을 다운로드하는 것 사이에서 문제가 해결되었습니다. 여전히 근본 원인이 무엇인지 알지 못하지만 어떤 형태의 색인 부패를 의심합니다.

다른 팁

이 문제를 보여주는 난독 화 된 데이터베이스를 제공 할 수 있습니까? 나는 이것을 경험 한 적이 없다. 최소한 테이블 정의를 제공하십시오. 열이 부유 한 열이 있습니까?

이것은 어리석은 것처럼 들릴 수 있습니다. 하지만...

실제 데이터베이스 및 Connection String (DSN)의 경로가 동일한 파일 위치를 가리키는가?

예를 들어 다른 ODBC 도구와 동일한 문제가 있습니까? 쿼리 도구? ODBC Connection Manager에서 ODBC 추적을 켤 수도 있습니다. 액세스 권한이없고 SQL 명령이 추적 될지 여부는 모르지만 때로는 ODBC 문제를 해결하는 데 도움이됩니다.

필드가 색인되어 있습니까? 그렇다면 인덱스 중 하나가 손상되어 MDB 파일을 압축해야합니다. 인덱스 인 경우 ~이다 부패하면 주요 문제로 이어질 수 있습니다. 기존 관계를 잃을 수 있습니다 (손상된 색인이 PK 인 경우) 또는 데이터를 잃을 수 있습니다. 따라서이 작업을 수행하기 전에 백업이 필요합니다. 손상된 색인이 있다면 대화식 액세스 컴팩트 작동이 알려줄 것이라고 생각하지만 그렇지 않은 경우 MSYSCOMPACTERRORS 테이블을 찾아 소형 중에 발생한 오류가 발생할 수 있습니다.

이것은 거의 거의 발생하지 않으며 두 가지 중 하나를 나타낼 수 있습니다.

  1. 쓸모없는 제트 버전을 포함한 잘못된 애플리케이션 설계 (서비스 팩 6 이전의 Jet 4는 이것에 매우 취약했으며, 그곳에서 발생했습니다).

  2. 신뢰할 수없는 운영 환경 (네트워킹/하드웨어/소프트웨어).

물론,이 제안은 진짜 긴 샷이지만, 다른 결과의 원인 중 하나입니다 (가장 일반적으로 가장 일반적은 부패한 지수로 주문하는 것이며 다른 순서와 다른 레코드 수로 끝납니다). .

문제는 당신이 쿼리를 커밋하지 않았다는 것입니다. PYODBC는 autocommit = false로 시작하므로 select, insert, update 등과 같은 모든 쿼리는 효과를 얻기 위해서는 트랜잭션을 시작합니다. 어느 쪽이든 전화 connection.autocommit = True 또는 전화 cursor.execute("commit") 쿼리 후, 그리고 나서 가져 오기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top