Qt und QODBC mit MS Access unter Linux

Alles rund um die Programmierung mit Qt
Antworten
mastercad
Beiträge: 8
Registriert: 24. Juli 2008 07:59
Kontaktdaten:

Qt und QODBC mit MS Access unter Linux

Beitrag von mastercad »

Hallo an alle !

ich bin neu hier, schwöre aber, das ich die Sufu und google schon bemüht habe. Vielleicht liegts an den falschen Suchbegriffen, oder es hat wirklich noch keiner damit rumexperimentiert.

Vorab, ich bin in english leider nicht so bewandert und daher hilft mir die doch ziemlich umfangreiche Doku von Trolltech nicht wirklich weiter :/

zum Problem :

ich verbinde per

Code: Alles auswählen

QSqlDatabase db_mdb = QSqlDatabase::addDatabase( "QODBC", "MSAccess");
bool ok = db_mdb.open();
übergebe die offene Datenbank an query

Code: Alles auswählen

QSqlQuery queryMysql(  db_mdb);
dann stelle ich eine suchanfrage mit

Code: Alles auswählen

queryMysql.exec( "SELECT * FROM adressen");
so dann zu den unklaren ergebnissen :

Code: Alles auswählen

queryMysql.size(); -> -1
queryMysql.numRowsAffected(); -> 0
QSqlRecord record = queryMysql.record();
record.count(); -> 178
Die Spaltenanzahl stimmt, eine zeile hat 178 Spalten. Warum aber sind die betroffenen Zeilen 0? und was soll mir das Warning bei ausführung des Programms sagen?

Code: Alles auswählen

QODBCDriver::checkHasSQLFetchScroll: Warning - Driver doesn't support scrollable result sets, use forward only mode for queries
ich hab bereits versucht den forwardOnly des Treibers auf false zu setzen, bzw. auf true, keine Änderung die Meldung kommt auch weiterhin.

Es wäre nett, wenn mir einer helfen kann, da ich die MS Access daten in einer MySQL DB weiterhin transparenter verwenden möchte und mir diese MS Datenbanken mit ihrer unflexibilität eh stinken.

vielleicht noch was zum abfragen der ergebnisse :

wenn ich die Zeilen so versuche auszulesen :

Code: Alles auswählen

for( i = 0; i < record.count(); i++)
{
	qDebug() << QObject::trUtf8( "Zeile : %1").arg( i) << queryMysql.value( record.indexOf( record.fieldName( i))).toString();
}
kommt

Code: Alles auswählen

QSqlQuery::value: not positioned on a valid record
"Zeile : 0" ""
QSqlQuery::value: not positioned on a valid record
"Zeile : 1" ""
...
QSqlQuery::value: not positioned on a valid record
"Zeile : 178" ""
wenn ich versuche so auf die Daten zuzugreifen :

Code: Alles auswählen

while( queryMysql.nextResult())
	{
		qDebug() << QObject::trUtf8( "Zeile : %1").arg( i) << queryMysql.value( record.indexOf( record.fieldName( i))).toString();
		i++;
	}
macht er gar nix, klar weil numRowsAffected 0 ist und er daher gar nicht erst in das Ereignis springt -.- .

Danke schonma für die Hilfe und das geduldige durchlesen meines Posts :)

CAD
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Access von Microsoft var noch nie multiplatform ( und odbc access linux driver ist eine utopie )
auf linux kann man hoechstens auf sqlite3 konvertieren und auf alle sisteme benutzen.... suche auf sf.net "ms access" da kommen einige tool ...
.........................
speack português italiano deutsch english castellà qt
mastercad
Beiträge: 8
Registriert: 24. Juli 2008 07:59
Kontaktdaten:

Beitrag von mastercad »

das was du erzählst ist schwachsinn patrik, access auf linux geht sehr wohl. ich greife mit php schon lang drauf zu und portiere so seit geraumer zeit die inhalte der access dateien in eine mysql datenbank um sie weiter benutztn zu können. und ich greife über odbc treiber auf access zu.

und das es forward only treiber gibt, wie eben auch der libmdbodbc ist mir bekannt. ich will nur wissen wie ich mich verhalten muss um trotzdem die daten ansprechen zu können.

das es funktioniert zeigt ja schon allein die tatsache, das er die richtige spaltenanzahl anzeigt aber die zeilen fehlen leider...

danke und mfg
CAD
mummy
Beiträge: 4
Registriert: 22. April 2008 22:53

Beitrag von mummy »

mastercad hat geschrieben: Vorab, ich bin in english leider nicht so bewandert und daher hilft mir die doch ziemlich umfangreiche Doku von Trolltech nicht wirklich weiter
Das ist aber ein problem, denn dort steht zum teil die lösung. Wenn du noch mehr programmieren willst musst du englische texte lesen können.
mastercad hat geschrieben: macht er gar nix, klar weil numRowsAffected 0 ist und er daher gar nicht erst in das Ereignis springt -.- .
numRowsAffected ist bei SELECTS undefiniert, da keine records verändert werden.
size ist -1, wenn die anzahl der records nicht ermittelt werden kann. Das ist i. d. R. Treiber und/oder DB abhängig.

Code: Alles auswählen

QSqlQuery oQuery;
oQuery.setForwardOnly( true);
bool ok = oQuery.prepare( "SELECT * FROM adressen");
ok = oQuery.exec();
ok = oQuery.first();
while( ok && oQuery.isValid() && !oQuery.lastError().isValid()) 
{
    ..... 
   stuff = oQuery.value( 1).toString();
   ok = oQuery.next();
}
oben mal ein grundsätzlicher Ablauf wie ich vorgehen würde. die rückgabewerte und fehlerhandling muss noch verbessert werden.

Tschau m
mastercad
Beiträge: 8
Registriert: 24. Juli 2008 07:59
Kontaktdaten:

Beitrag von mastercad »

super sache mummy, vielen vielen dank :)

so seh ich wenigstens schonmal die erste Zeile in der ganzen Datenbank. Ich habe mich nach 3 Jahren wieder mal rangesetzt um C++ und OOP zu lernen und das nun auf Linux da ich komplett von M$ weg bin mittlerweile. Da öffnete sich für mich die Tatsache, das ich nicht mehr mit der WindowsAPI programmieren kann und so musste ich mir ne neue Möglichkeit suchen, da ich mich an die KDE gewöhnt hatte lag der Weg nahe, Qt zu benutzen.

Nun hab ich hier 2 deutsche ;) Bücher liegen die sich mit Qt befassen und so ziemlich alles anreisen. Ich bin noch in der Phase, alles zu verstehen, da Qt ja ein komplett anderes Konzept benutzt um Events abzufangen und zu verarbeiten. Es ist intuitiver, aber stellenweise auch, gerade wegen der SLOTs und SIGNALe sehr gewöhnungsbedürftig. Das mit dem English ist ein bisschen mein Pferdefuss, ich habe aber leider durch meine Arbeit und auch meine sonstigen Aktivitäten keine wirkliche Zeit gefunden English zu lernen und in meiner damaligen Schulzeit wars nen Wahlfach, was macht man schon zusätzlich in der Schule wenn man die Wahl hat... heut bereue ichs sehr.

Wenn du mir jetzt noch helfen könntest, wie ich einen Datensatz weiter rutsche und du mir sagen könntest, wie ich mit Fehlern umgehen könnte, da ich ne elennenlange Liste nach abruf des ersten Datensatzes bekomme.

Es wird bis Spalte 11 ausgelesen. Spalte 12 ist auch mit Inhalten gefüllt also kanns net nen Problem mit nem leeren Feld sein und es gibt wie gesagt in dieser Datenbank 178 Spalten, also ist auch noch nicht Schluß.

Code: Alles auswählen

*** glibc detected *** ./Datenbanktest: free(): invalid next size (fast): 0x091b73e8 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6[0xb6c1f8f5]
/lib/i686/cmov/libc.so.6(cfree+0x90)[0xb6c23360]
/usr/local/Trolltech/Qt-4.4.0/lib/libQtCore.so.4(_Z5qFreePv+0x1d)[0xb6f60a1d]
.
.
.
b7f42000-b7f5c000 r-xp 00000000 08:08 860162     /lib/ld-2.7.so
b7f5c000-b7f5e000 rw-p 00019000 08:08 860162     /lib/ld-2.7.so
bfe49000-bfe5e000 rw-p bffeb000 00:00 0          [stack]
Abgebrochen
mfg und mega Dank nochmal !
CAD


***** Edit *****

Kurios ist auch, das ab und an anstatt das Programm zu starten nen Speicherzugriffsfehler kommt. Nix weiter, steht nach Ausführung nur einfach so in der Shell -.- .
Antworten