[英]QSqlDatabase::open() always returns true
我正在嘗試使用Qt-Framework連接到SQL數據庫。
不幸的是db.open()總是返回true(你可以設置任何密碼,主機名等等),盡管沒有建立連接(?)。 我從查詢中得出的結果對數據庫沒有任何影響。
我在Ubuntu 14.04上使用LAMPP。
我有以下代碼:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QSql>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlQuery>
void MainWindow::on_ButtonSQL_clicked()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "con1");
db.setHostName("localhost");
db.setDatabaseName("kinectshop2015");
db.setUserName("root");
db.setPassword("");
QMessageBox msgBox;
if (db.open()) {
msgBox.setText("Yay! Your database host is "+db.hostName()+" .\n"+" The name of the database is "+db.databaseName()+".");
msgBox.exec();
}
QSqlQuery query;
query.exec("INSERT INTO users (id, username, balance, isAdmin)" "VALUES(3, 'somebody', 10000, 1)");
}
一個問題是您正在指定connectionName。
QSqlDatabase QSqlDatabase::addDatabase(const QString & type, const QString & connectionName = QLatin1String( defaultConnection ))
如果未指定connectionName,則新連接將成為默認連接
鑒於您的數據庫連接不是默認連接,您需要告訴QSqlQuery使用哪個數據庫,即
QSqlQuery query(db);
query.exec("INSERT INTO users (id, username, balance, isAdmin)" "VALUES(3, 'somebody', 10000, 1)");
另一個'問題'是,使用sqlite,你總是通過你正在進行的調用創建一個新的數據庫,因此問題不是數據庫沒有打開,而是它的內容不正確(因為如果你指定一個數據庫,它將是空的不存在的文件名)。 如果我拿你的代碼並添加
qDebug() << query.lastError();
在query.exec
之后,它理所當然地抱怨
QSqlError(1,“無法執行語句”,“沒有這樣的表:用戶”)
如果我在插入查詢之前包含一個語句來創建表
QSqlQuery createTable("create table users ( id INTEGER, username TEXT, balance REAL, isAdmin INTEGER)",db);
createTable.exec();
我正確地在新創建的db文件中獲取該表,並且它具有您嘗試插入的條目。
這有幫助嗎?
這是解決我的問題的原因。 我使用驅動程序QMYSQL而不是QSQLITE。 我只使用了后者,因為第一個無法加載。 在Ubuntu和QT5上只需鍵入sudo apt-get install libqt5sql5-mysql即可解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.