# ODBC einrichten

## manuels

Moin zusammen,

ich muss auf eine MS Access-Datei (*.mdb) zugreifen und mache dies mittels Qt:

```
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

QString odbc = "DRIVER={MDB};DBQ=file.mdb";

db.setDatabaseName(odbc);

if (!db.open())

[...]
```

Leider schlägt das Öffnen der Datei immer fehl. Dies wird in der Konsole ausgegeben:

```
QSqlDatabasePrivate::database: unable to open database: "[unixODBC][Driver Manager]Data source name not found, and no default driver specified QODBC3: Unable to connect" 

```

Meine /etc/odbcinst.ini sieht so aus:

```

[Microsoft Access Driver (*.mdb)]

Driver          = /usr/lib/libmdbodbc.so.0

[MDB]

Driver          = /usr/lib/libmdbodbc.so.0

```

Die Datei existiert auch:

```
#ls /usr/lib/libmdbodbc.so.0* -l

lrwxrwxrwx 1 root root     19 2010-11-04 21:15 /usr/lib/libmdbodbc.so.0 -> libmdbodbc.so.0.0.0

-rw-r--r-- 1 root root 114868 2010-06-14 07:29 /usr/lib/libmdbodbc.so.0.0.0

```

Meiner Ansicht nach ist es auf jeden Fall ein ODBC-Einrichtungsfehler, kein Programmierfehler.

Hat jemand von euch Erfahrung mit diesem ekeligen ODBC-Treiber und eine Idee woran das liegen kann?

Tschö mit ö

Manuel

----------

## franzf

Ich hab das jetzt interessehalber mal ausprobiert. Geht auch nicht ohne ~/.odbc.ini.

Wenn ich diese Datei Erstelle und sowas reinschreib:

```
[TestMDB]

DRIVER = MDB

Database = /pfad/zur/myaccessfile.mdb
```

Connecten mit

```
db.setDatabaseName("TestMDB");
```

Dann lädt er die Datei. Dummerweise gibt es dann nen SegFault

```
#0  0x00007ffff206d371 in mdb_fetch_row () from /usr/lib64/libmdbodbc.so.0.0.0

```

Kann aber natürlich an einem fehlerhaften .mdb liegen (hab zu Testzwecken einfach eins via google gesucht...)

----------

## 69719

Ist zwar nicht Access, aber Excel und Access sollten sich nicht großartig unterscheiden.

Außerdem hast du damit einen Anhaltspunkt zum basteln  :Wink: 

Viel Spaß

```

m_db = QSqlDatabase::addDatabase( "QODBC", "excel" );

m_db.setDatabaseName( "DRIVER={MICROSOFT EXCEL DRIVER (*.XLS)};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\""+filename+"\";DBQ="+filename );

if ( ! QSqlDatabase::database( "excel" ).open() ) {

   ERRMSG( QString( "Export Datei konnte nicht erzeugt werden!\n%1" ).arg( QSqlDatabase::database( "excel" ).lastError().text() ) );

   return;

}

query = QSqlQuery( QSqlDatabase::database( "excel" ) );

if ( ! query.exec( "CREATE TABLE ..." ) ) {

   SQLERRMSG( query, __FILE__, __LINE__ );

   QSqlDatabase::database( "excel" ).close();

   return;

}

...

QSqlDatabase::database( "excel" ).close();

```

UPDATE

Sehe auch gerade, dass in der Dokumentation sogar als Beispiel Access genommen wird.

http://doc.qt.nokia.com/4.6/qsqldatabase.html#setDatabaseName

----------

## manuels

 *escor wrote:*   

> Ist zwar nicht Access, aber Excel und Access sollten sich nicht großartig unterscheiden.
> 
> Außerdem hast du damit einen Anhaltspunkt zum basteln 
> 
> [...]
> ...

 Ich habe das Beispiel von Qt bereits ausprobiert und es funktioniert nicht.

Daher war ich der Meinung, dass es ein Fehler in der ODBC-Einrichtung ist.

Kannst du mal deine /etc/odbcinst.ini bzw. ~/.odbcinst.ini posten?

----------

## manuels

 *manuels wrote:*   

> Kannst du mal deine /etc/odbcinst.ini bzw. ~/.odbcinst.ini posten?

 Wärst du so freundlich?

----------

## franzf

 *manuels wrote:*   

>  *manuels wrote:*   Kannst du mal deine /etc/odbcinst.ini bzw. ~/.odbcinst.ini posten? Wärst du so freundlich?

 

Meinst du mich? Sry, hab gedacht der ganze Beitrag bezieht sich auf escor...

```
$ cat /etc/unixODBC/odbcinst.ini

[MDB]

Driver = /usr/lib64/libmdbodbc.so.0.0.0

$ cat ~/.odbc.ini

[TestMDB]

DRIVER = MDB

Database = /home/franz/Programmieren/qt/Tests/sql/odbc/ms_access/myaccessfile.mdb
```

Holen mit

```
db.setDatabaseName("TestMDB");
```

----------

## manuels

 *franzf wrote:*   

> 
> 
> Meinst du mich? Sry, hab gedacht der ganze Beitrag bezieht sich auf escor...
> 
> 

 War es eigentlich auch.

Aber mit deinem Beispiel funktioniert es auch bei mir.

Nur nicht direkt, also mit odbcinst.ini-Eintrag und ohne einen odbc.ini-Eintrag zu erstellen.

----------

