Fehlender QODBC Treiber

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
derneue87
User
Beiträge: 2
Registriert: Mittwoch 6. April 2022, 07:24

Hallo und einen schönen guten Morgen,
ich bin neu hier in diesem Forum. Python ist auch "Neuland" für mich und bitte schon mal um Entschuldung, falls ich hier bei der Erstellung des Themas was falsch gemacht. Ich konnte zwar ein ähnliches Problem hier finden, allerdings keine Lösung.

Nun zum Problem:
Ich nutze Pyside6 in meinem Programm. Das Programm nutzt den QODBC-Treiber um mit einer MS SQL Datenbank zu kommunizieren. In meiner Entwicklungsumgebung Pycharm funktioniert alles wie soll. Wenn ich aber über "auto py to exe" eine ausführbare Datei erstelle (als Verzeichnis, nicht als einzelne Exe-Datei) kommt es zum Fehler:

Code: Alles auswählen

QSqlDatabase: QODBC driver not loaded
QSqlDatabase: available drivers:
QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
Der Programmcode der Datenbank betreffend sieht wie folgt aus:

Code: Alles auswählen

from PySide6.QtWidgets import QApplication, QMainWindow,QMessageBox
from PySide6 import QtSql,QtSerialPort,QtCore



    def datenbankVerbindung(self):
        db.open()

        if not db.open():
            msgbox=QMessageBox()
            msgbox.setWindowTitle("Fehler: Datenbankverbindung")
            msgbox.setText("Datenbank konnte nicht geöffnet werden!")
            msgbox.exec()


server_addr = "Servername\\Datenbankinstanz"
datenbank = "Datenbank"
benutzer = "Benutzer"
passwort = "Passwort"
db = QtSql.QSqlDatabase.addDatabase("QODBC")
db.setDatabaseName(f'Driver={{SQL SERVER}}; Server={server_addr}; Database={datenbank}; UID={benutzer}; PWD={passwort}')


if __name__ == '__main__':
    app=QApplication()
    server = Server()
    server.show()
    server.datenbankVerbindung()
    app.exec()

Bisher hab ich leider keine Lösung gefunden. Den Ordner "sqldriver" samt Inhalt in den Verzeichnisordner der Exe-Datei zu kopieren brachte leider auch nichts. Hat vielleicht hierzu jemand ein Lösung???
derneue87
User
Beiträge: 2
Registriert: Mittwoch 6. April 2022, 07:24

So wie es ausschaut, habe ich das Problem selbst gelöst.

Zuvor hatte ich auto py to exe /pyinstaller zur Erstellung der EXE-Datei genutzt. Nun habe ich cx_freeze dazu genutzt und damit hat es nun problemlos funktioniert.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@derneue87: Die Meldung ist eigentlich recht deutlich: Es braucht ein `QCoreApplication`-Objekt, oder etwas davon abgeleitetes, bevor man mit `QSqlDatabase` Treiber-Plugins laden kann. Der Code erstellt das `QApplication`-Objekt erst später. Das muss vorher passieren.

Weitere Anmerkungen: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Damit gibt es dann auch keine globalen Variablen mehr. `datenbankVerbindung()` kann also nicht mehr einfach so magisch auf `db` zugreifen. Alles was Funktionen und Methoden ausser Konstanten benötigen, wird als Argument(e) übergeben.

`datenbankVerbindung` ist ein unpassender Name für eine Methode, denn die werden üblicherweise nach Tätigkeiten benannt um sie von eher passiven Werten besser unterscheiden zu können. Das V müsste auch klein sein, denn Datenbankverbindung ist im Deutschen *ein* Wort.

Das ist auch keine Methode, weil es den `Server` hier ja gar nicht braucht. Funktionen sollte man nicht ohne Grund in eine Klasse stecken.

`open()` wird auf der Datenbank zweimal aufgerufen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox
from PySide6 import QtSql, QtSerialPort, QtCore

SERVER_ADDR = "Servername\\DATENBANKinstanz"
DATENBANK = "Datenbank"
BENUTZER = "Benutzer"
PASSWORT = "Passwort"


class Server(QMainWindow):
    ...


def verbindung_herstellen(db):
    if not db.open():
        error = db.lastError()
        QMessageBox.information(
            None,
            "Fehler: Datenbankverbindung",
            (
                f"Datenbank konnte nicht geöffnet werden:\n"
                f"{error.databaseText()}\n"
                f"{error.driverText()}"
            ),
        )


def main():

    app = QApplication()
    db = QtSql.QSqlDatabase.addDatabase("QODBC")
    db.setDatabaseName(
        f"Driver={{SQL SERVER}}; Server={SERVER_ADDR}; Database={DATENBANK};"
        f" UID={BENUTZER}; PWD={PASSWORT}"
    )

    server = Server()
    server.show()
    verbindung_herstellen(db)
    app.exec()


if __name__ == "__main__":
    main()

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Antworten