2016-06-22 7 views
0

Angenommen, ich möchte eine Verbindung zu SQLite3-Datenbank in Qt zu öffnen. Es wird mit einer existierenden Datenbank verbunden dbName.Wie überprüft man, ob Datei mit Datenbanktreiber in Qt

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 

Jetzt brauche ich db.setDatabaseName(dbName) zu setzen, wo dbName durch eine QFileDialog empfangen wird.

Solange jedoch dbName ein gültiger Dateiname ist, ist db.open() immer true. Gibt es trotzdem zu überprüfen, ob die Datei dbName eine SQLite3-Datenbank ist, aber nicht von einem anderen Typ? Was kann ich tun, ist jetzt eine Abfrage ausführen und prüfen, ob Fehler wie:

db.setDatabaseName(dbName); 
if (db.open()) { 
    QSqlQuery qr(db); 
    if (!qr.exec(".database;")) { 
    qDebug() << qr.lastError().text(); 
    return false; 
    } 
} 

aber es wird nicht funktionieren, wenn die Datei leer ist.

+0

Was ist der Zweck Ihrer Anwendung? Soll es * irgendeine * SQLite-Datenbank öffnen können, oder wollen Sie nur auf die eigenen Anwendungsdateien zugreifen? –

+0

es soll in der Lage sein, jede SQLite-Datenbank zu öffnen, Daten zu lesen, kann der Benutzer ändern und speichern – scmg

Antwort

1

Qt verwendet immer das SQLITE_OPEN_CREATE Flag, so dass nicht existierende oder leere Dateien als gültig betrachtet werden (für eine neue, leere Datenbank).

Wenn Sie Qt nicht ändern oder Ihren eigenen Datenbanktreiber schreiben möchten, ist die einzige Alternative, manuell nach einem gültigen database header in der Datei zu suchen.

1

Ich musste das gleiche Problem haben.

In der Tat gibt es zwei Probleme:

1/A CL sagte Qt verwendet immer die SQLITE_OPEN_CREATE Flagge, also wenn Sie versuchen, eine Datenbank zu öffnen, die auf eine nicht vorhandene Datei verweisen, wird die Datenbank sein erstellt und Sie erhalten einen Erfolg.

Sie dieses Problem adressieren kann durch Prüfen, ob die Datei vor dem Öffnen existiert (siehe QFile :: Exists statische Methode)

2/SQLite Verwendung „faul Initialisierung“, so, bis Sie eine Anfrage an die Datenbank zu machen, die Datei ist nicht wirklich geöffnet. Sie können dieses Problem lösen, indem Sie direkt nach dem Öffnen der Datenbank eine einfache Anfrage ausführen und das Ergebnis prüfen.

Wenn Sie wissen nichts im Voraus über das Datenbankschema, können Sie versuchen, eine der „PRAGMA“ Werte zu lesen: http://www.sqlite.org/pragma.html#pragma_table_info

Verwandte Themen