[gelöst] Verteilen einer Qt Sql (Oracle) Anwendung

Alles rund um die Programmierung mit Qt
Antworten
Konk
Beiträge: 13
Registriert: 23. März 2007 15:26

[gelöst] Verteilen einer Qt Sql (Oracle) Anwendung

Beitrag von Konk »

Ich habe ein kleines Tool geschrieben, das einige Zeilen aus einer Oracle DB ausliest und darstellt.
Funktioniert auf dem Entwicklungsrechner einwandfrei. Das Oracle OCI Plugin habe ich wie in der Qt Hilfe
beschrieben compiliert, hat alles geklappt.
Jetzt will ich das Tool auf einem anderen Rechner ohne Entwicklungsumgebung laufen lassen. Leider bekomme
ich immer die Meldung: "Driver not loaded Driver not loaded" (ja, 2x der gleiche Text hintereinander) an der folgenden Codestelle:

Code: Alles auswählen

	QSqlDatabase db;
	db.setDatabaseName("myDb");
	db.setUserName("user");
	db.setPassword("pwd");
	if (!db.open()) {
		QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
	}
Ich habe alles zum deployen von Anwendungen durchgelesen und ausprobiert:
Qt DLLs mitgeliefert (auch die qsqloci4.dll)
Oracle DLLs
Oracle DLLs im Unterordner \plugins oder \sqldirvers oder \plugins\sqldrivers
$QTDIR auf die Verzeichnisse mit den DLLs gesetzt
Aus VS ein .pro gemacht, dort CONFIG += thread eingetragen, wieder in VS importiert (war die Lösung eines ähnlichen Problems hier im Forum)

Bis jetzt war meine Liebesmüh erfolglos.
Falls jemand erfolgreich eine Qt Anwendung mit Datenbankzugriff (evtl sogar Oracle) erfolgreich auf einem anderen Rechner ohne
Entwicklungsumgebung zum Laufen gebracht hat - vielleicht hat der einen Tipp, was bei mir noch fehlt.

System:
Windows XP, Visual Studio 2005, Qt 4.3.0 commercial (Support schon ausgelaufen)
Zuletzt geändert von Konk am 30. Januar 2009 13:22, insgesamt 1-mal geändert.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

lieferst denn die dlls mit...im entsprechenden Ordner(sqldrivers) direkt neben der ausführbaren datei
Konk
Beiträge: 13
Registriert: 23. März 2007 15:26

Beitrag von Konk »

ja, ich hab es mit den DLLs an allen Orten versucht:
im Verzeichnis der .exe
in <Verz. der .exe>\sqldrivers
in <Verz. der .exe>\plugins\sqldrivers
Auch wenn ich _jede_ DLL an jeden Ort kopiere kommt die Meldung "Driver not loaded..."
Wenn ich die Lösung hab, poste ich sie - vielleicht interessiert das noch mehr Leute
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

schau mal mi dem deendecy walker was fehlt...

hier im forum gibts das prob auch wöchentlich... such doch mal!
Konk
Beiträge: 13
Registriert: 23. März 2007 15:26

Beitrag von Konk »

Meine längliche Forumsuche hat nur den Tipp mit CONFIG += threads zu Tage gefördert, was leider nichts gebracht hat.

Der Dependency Walker zeigt diese "fehlenden" DLLs an:
dwmapi.dll, shlwapi.dll, mpr.dll
Die meckert er allerdings auch auf dem Entwicklungsrechner an, wo alles einwandfrei läuft. In Qt Applikationen ohne DB Funktionalität (auf dem Rechner ohne IDE) werden die auch als fehlend angezeigt obwohl alles funktioniert. Deshalb vermute ich, dass es nicht daran liegt.
Trotzdem danke für den Tipp.
Konk
Beiträge: 13
Registriert: 23. März 2007 15:26

Beitrag von Konk »

P.S.: Die GUI startet natürlich, nur wenn ich den Connect-Knopf drücke, dann kommt die Meldung.
seneca
Beiträge: 23
Registriert: 6. Januar 2006 09:57

Beitrag von seneca »

Die Oracle OCI libraries werden wohl nicht gefunden, die müssen über die PATH Umgebungsvariable bekannt gemacht werden (Arbeitsplatz / Einstellungen /Erweitert / Umgebungsvariablen) . Bei einer Oracle Client installation wäre das z.B: C:\oracle\product\10.2.0\client_1\bin

Nach dem Setzen abmelden/anmelden (bei Benutzervariablen) oder Reboot (bei Systemvariablen) nicht vergessen.
Konk
Beiträge: 13
Registriert: 23. März 2007 15:26

Beitrag von Konk »

Den Pfad zu den DLLs in PATH aufzunehmen hat noch nicht den gewünschten Erfolg gebracht, auch nicht ein Kopieren des /bin Verzeichnisses des Oracle Clients vom Entwicklungsrechner auf den anderen Rechner.
Ich teste gerade ob/welche Teile des Oracle Clients man auf dem anderen Rechner installieren muss, damit es läuft. Bei Erfolg gebe ich Bescheid :-)
seneca
Beiträge: 23
Registriert: 6. Januar 2006 09:57

Beitrag von seneca »

Mit kopieren alleine wirst du kaum glücklich werden.

Nach meiner Erfahrung hilft nur die reguläre Installation des Oracle Clients. Da hängt doch noch einiges mehr dran als nur das bin Verzeichnis (SQL Net, Locales, die ganzen Registry-Einträge etc. pp.)

Hätte mir eigentlich denken können dass du den Client gar nicht installiert hast, sonst wäre PATH nämlich bereits richtig gesetzt gewesen.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Hallo,

Du musst auch nicht unbedingt den kompletten Client installieren, der Instant Client genügt dafür vollkommen (Müssten denke ich ca. 120 MB in ca. 7 Dateien sein). Diese einfach zu deiner *.exe kopieren, danach sollte es eigentlich laufen

LG NoRulez
seneca
Beiträge: 23
Registriert: 6. Januar 2006 09:57

Beitrag von seneca »

An den Instant Client habe ich gar nicht gedacht, aber das ist natürlich für deinen Zweck noch besser, den darfst du sogar frei zusammen mit deiner Anwendung verteilen. Bei Version 10 ist der noch knapp 20 MB, bei Version 11 dann etwa doppelt so viel (die üblichen Oracle-Blähungen halt).
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Nein die etwa 120 MB stimmen schon, da ist nämlich eine Datei von Oracle dabei, die um die 90 MB groß ist

LG NoRulez
seneca
Beiträge: 23
Registriert: 6. Januar 2006 09:57

Beitrag von seneca »

Es gibt verschiedene Pakete. Das kleinste für V10 enthält allerdings nur folgendes:

Code: Alles auswählen

Verzeichnis von Z:\Projekte\oracle\instantclient_10_2

27.01.2009  17:34    <DIR>          .
27.01.2009  17:34    <DIR>          ..
03.03.2008  21:20           352'256 oci.dll
11.02.2008  12:58            77'824 ocijdbc10.dll
02.03.2008  22:15         1'097'728 orannzsbb10.dll
03.03.2008  19:55           344'064 ociw32.dll
03.03.2008  21:29               325 BASIC_LITE_README
02.02.2008  14:49         1'555'682 ojdbc14.jar
03.03.2008  21:27        18'284'544 oraociicus10.dll
02.02.2008  14:49         1'609'607 classes12.jar
03.03.2008  21:28           774'144 oraocci10.dll
               9 Datei(en)     24'096'174 Bytes
               2 Verzeichnis(se), 12'295'565'312 Bytes frei
Konk
Beiträge: 13
Registriert: 23. März 2007 15:26

Beitrag von Konk »

Geschafft! Die Anwendung läuft auch auf einem anderen Rechner.

Die Schritte die dazu nötig waren:

im Quellcode:
- a.addLibraryPath(a.applicationDirPath()+QDir::separator()+"plugins");
Wobei a meine QApplication ist.

Sonstiges:
- das Verzeichnis "plugins" seiner Qt installation ins Programmverzeichnis auf dem anderen Rechner kopieren. Alles bis auf die DLL "\sqldrivers\qsqloci4.dll\" kann gelöscht werden. Ein Kopieren dieser DLL ins Programmverzeichnis hat nicht geklappt, sie muss an diesem Ort liegen, an den auch der Library Path verweist

- die Datei tnsnames.ora vom Entwicklungsrechner kopieren in ein Verzeichnis <beliebig>\network\admin\tnsnames.ora. Danach die Umgebungsvariable ORACLE_HOME erstellen und auf das <beliebig> Verzeichnis zeigen lassen. (nicht auf <beliebig>\network\admin!!)

Und schon klappts :D
Falls einer das auch einfach hinbekommen hat, bin ich für Vorschläge offen. Vielen Dank für Eure Hilfe!!!
Konk
ViktorZacek
Beiträge: 8
Registriert: 3. Februar 2010 15:14

Beitrag von ViktorZacek »

Geht (aus meiner Sicht) noch einfacher:

Die Includes:

Code: Alles auswählen

#include <QSqlDatabase>
#include <QSqlError>
Und dann in einem Button (oder sonstwo *g*):

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QOCI") ;
db.setUserName(ui->lineUser->text());
db.setPassword(ui->linePassword->text());
db.setDatabaseName(ui->lineDB->text());

if (!db.open()) {
  QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
} else {
  QMessageBox::information(this, "Oracle Anmeldung", "geht." , QMessageBox::Ok);
}
db.close();
Im Pfad zu meiner Exe-Datei liegen noch die folgenden Dateien:
  • libgcc_s_dw2-1.dll
    mingwwm10.dll
    QtCore4.dll
    QtGui4.dll
    QtSql4.dll
Ausserdem die folgenden Ordner:
  • instantclient (enthält das Basic-Paket von der Oracle-Homepage)
    sqldrivers (enthält die selbstkompilierten OCI-Dateien entsprechend der Hilfe)
    tns (enthält tnsnames.ora und sqlnet.ora)
Der Start des Programmes wäre dann über eine Batchdatei, wenn man möchte, kann man die entsprechenden Umgebungsvariablen natürlich auch anders setzen.

Code: Alles auswählen

set TNS_ADMIN=.\tns
set PATH=.\instantclient;%PATH%
programm.exe

Keine Ahnung, ob das Vorgehen Qt-like ist (verwende Qt gerade das erste Mal)... aber es funktioniert ;-)
Antworten