Jestem na Win7 x64, używając Pythona 2.7.1 x64. Przesyłam aplikację stworzoną w VC++ do Pythona dla celów edukacyjnych.
Oryginalna aplikacja nie ma problemu z połączeniem do formatu 2007 pliku DB MS Access stosując następujący ciąg połączenia:
OleDbConnection^ conn = gcnew OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=|DataDirectory|DB.accdb");
Teraz, gdy próbuję połączyć się z tego samego pliku DB (umieścić w katalogu C: \ tym razem) w Pythonie przy użyciu pyodbc i następujący ciąg połączenia o:
conn = pyodbc.connect("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\DB.accdb;")
i nieważne, czy trzymam dostawcy OLEDB lub używam Provider=MSDASQL;
jak wspomniano here (MS mentions it's not availiable for 64bit), wciąż otrzymuję następujący błąd:Podłączanie do bazy danych MS Access 2007 (.accdb) przy użyciu pyodbc
pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnectW)')
Co może powodować ten problem?
DODAJ: Dosłownie przyjrzałem się dokumentom pyodbc i wypróbowałem conn = pyodbc.connect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=c:\\DB.accdb;")
- ten sam błąd. To jest naprawdę dziwne, ponieważ pyodbc.dataSources() pokazuje, że mam tego dostawcę.
ADD2: Próbowałem użycia win32com.client, takich jak here w celu połączenia przy użyciu OLE DB - bez powodzenia. Wydaje się, że to niemożliwe, nic nie działa.
Dziękuję, będę świadomy problemów z kompatybilnością x64. Jednak dla tej aplikacji postanowiłem ręcznie przenieść DB do SQLite ręcznie i używać go w ten sposób - pomyślałem, że to potencjalnie rozwiąże wiele problemów :) W każdym razie, plik DB jest przeznaczony do edycji tylko przez samą aplikację. – havelock
Edytowałem odpowiedź, aby dodać więcej sugestii. Może problem jest tylko z ciągiem połączenia? Oszczędź ci przepisania. –
Użyłem ciąg połączenia, o którym wspomniałeś na początku, zobacz sekcję "ADD"; utworzenie użytkownika DSN może rozwiązać problem (chociaż nie jestem pewien, czy to pomogłoby, po tym jak wszystkie sterowniki/dostawcy zawiodły) i nadal jestem pewien, że to, o czym wspomniałeś w drugim punkcie, dotyczy przypadku, ponieważ oryginalna aplikacja VC++ ma 32 bity), ale jak już wspomniałem, rozwiązałem problem w bardziej drastyczny sposób. – havelock