2009-05-06 9 views
3

Microsoft Jet을 통해 pyodbc를 사용하여 Python 프로그램에서 Microsoft Access 2003 데이터베이스의 데이터에 액세스합니다.PyODBC 및 Microsoft Access : 간단한 쿼리의 일치하지 않는 결과

Microsoft Access 데이터베이스는 타사에서 제공됩니다. 나는 그 자료 만 읽는다.

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

나는 형태의, 간단한 쿼리에로 요약했다 :

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

나는 난독 화 한 필드 이름과 값을하지만 정말, 그보다 더 사소한하지 않습니다! Access에서 쿼리를 실행하면 하나의 레코드가 반환됩니다.

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

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

가 검색어 문자열의 값은 절단 : 다음

나는 다음과 같다 코드, pyodbc에 그것을 실행 및 Access에서 작업 쿼리에서 붙여 넣은 있지만 아니요 레코드를 반환합니다. 나는 그것이 같은 기록을 되 찾을 것으로 기대했다.

field2에 대해 다른 값을 검색하도록 쿼리를 변경하면 bingo가 작동합니다. 그것이 거부하는 것은 단지 일부 값입니다.

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

업데이트 : 더욱 간단 해집니다. 다음 쿼리는이 때때로 데이터를 채 웁니다 다른 응용 프로그램에 의해 캐싱 및/또는 부적절한 트랜잭션 관리의 형태와 관련이 있다면 숙고

... 테이블에서

SELECT COUNT (*)를 다른 번호를 제공합니다 .

+0

쿼리 문자열을 실행하기위한 커서 개체가 있어야합니까? 그런 다음 커서에서 Fetchall을 호출하여 행을 생성합니다. http://code.google.com/p/pyodbc/wiki/Rows – barrowc

+0

@barrowc, Interesting을 참조하십시오. 나는 커서() 호출의 부족을 알지 못했다. 나는 이것을 어딘가에 모방 한 것으로부터 복사했다고 확신한다. 나는 그것을 [rows = connection.cursor(). execute (queryString) .fetchall()]에 다시 추가하려고 시도했지만 아무런 차이가 없었습니다. 분명히 pyodbc는 Python DB API 스펙보다 더 관대합니다. – Oddthinking

답변

1

Access 2007로 업그레이드하고 원본 데이터베이스에서 새 복사본을 다운로드하는 중 일부 문제가 해결되었습니다. 근본 원인이 무엇인지 아직 모르지만 인덱스 손상의 일부 형태로 의심됩니다.

1

이 문제를 보여주는 난독 화 데이터베이스를 제공 할 수 있습니까? 나는 이것을 결코 경험하지 못했다. 적어도 테이블 정의를 제공하십시오 - 열이 부동 소수입니까 또는 소수입니까?

+0

나는 수레 확인을위한 제안을 위해 당신을 선택했습니다. 그러나 좋은 생각은 문제가 아니며 업데이트 된 버전은 WHERE 절이 없음을 보여줍니다. 나는 Access에서 테이블 설명을 얻는 방법을 연구 중이다. – Oddthinking

1

어리석은 것 같습니다. 그러나 ...

& 연결 문자열 (DSN)이 동일한 파일 위치를 가리 킵니까?

+0

그건 완벽하게 합리적인 제안입니다. 나는 그것이 정말로 사소한 것으로 밝혀 졌길 바란다. 두 번 확인했는데 둘 다 같은 디렉토리를 가리 킵니다. Access 2003이 혼란스럽고 삭제 된 최근의 MDB 파일을 분명히 열어 보았습니다. 따라서 여기에 캐싱이나 유사한 현상이 있는지 궁금합니다. – Oddthinking

+0

컴퓨터에서 파이썬 기반 응용 프로그램을 사용하여 MDB 파일을 네트워크 경로에 사용하고 있습니까? – shahkalpesh

1

다른 ODBC 도구와 동일한 문제가 있습니까? 예 : Query Tool? ODBC 연결 관리자에서 ODBC 추적을 설정할 수도 있습니다. 에 액세스 할 수 없으며 해당 sql 명령이 추적되는지 여부는 알 수 없지만 때때로 ODBC 문제를 해결하는 데 도움이됩니다.

+0

방금 ​​Query Tool을 설치했습니다. 데이터 소스를 다른 방법 (연결 문자열 아님)으로 지정해야했습니다. "SELECT COUNT (*) FROM table"을 실행했습니다. 그것은 나에게 파이썬 코드와 같은 대답과 Access에서 같은 문장에 대한 다른 (더 작은) 대답을 주었다. 좋은 소식입니다. 파이썬 코드 나 pyodbc가 아닙니다. 나쁜 소식 : Access/ODBC를 신뢰할 수 없습니다. – Oddthinking

+0

액세스는 정말 멋진 도구이지만 버그가 있습니다. 예를 들어, 나중에 SQL에서 쿼리를 작성하고 나중에 편집하면 구문 오류가 수정되었음을 알 수 있습니다. 쿼리를 메모장에 복사 한 다음 새 Access SQL 디자인보기로 다시 가져와야합니다. 액세스가 나에게 좋고, 혼란스럽고 복잡 해지는 것 같지 않습니다. –

+0

이 질문에 대한 액세스가 사용 중이십니까? 지금까지 내가 알 수있는 것처럼 Jet 만 사용 중이기 때문에 Access QBE는 관련되지 않습니다. –

1

필드의 색인이 생성 되었습니까? 그렇다면 아마도 인덱스 중 하나가 손상되어 MDB 파일을 압축해야합니다. 색인 인 경우 중요한 문제가 발생할 수 있습니다. 기존 관계를 잃을 수 있습니다 (손상된 색인이 PK 인 경우). 그렇지 않으면 데이터가 손실 될 수 있습니다. 이렇게하기 전에 백업이 필요합니다.손상된 인덱스가있는 경우 대화 형 액세스 압축 작업에서 알 수 있다고 생각하지만 그렇지 않은 경우 압축 도중 발생한 오류를 알려주는 MSysCompactErrors 테이블을 찾을 수 있습니다.

  1. 나쁜 응용 프로그램 디자인, 사용되지 않는 제트 버전 (서비스 팩 6 전에 제트 4를 포함한이 매우 취약했다, 나는 발생 곳이입니다 : 이것은 아주 드물게 만 발생하지 않으며 두 가지 중 하나를 표시 할 수 있습니다

    그것).

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

,이 제안은 실제 장거리 슛이지만, 서로 다른 결과를 확실히 하나의 원인이다 (가장 일반적인이 손상 지수 BY ORDER하는 것 및 다른 기록하게 될 겁니다 다른 ORDER BY보다 많음).

+0

나는 이것을 조사 할 것이다. 내 첫 번째 단계는 JET 버전을 확인하는 것이 었습니다. Vista 서비스 팩 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 데이터베이스에 대해 잘 모르겠지만 SQL Server를 사용하는 경우 havin autocommit = False는 암시 적 트랜잭션이 있음을 의미합니다. http://msdn.microsoft.com/en-us/library/ms188317.aspx는 SELECT조차도 트랜잭션을 시작한다고 말합니다. –