Header: include
qmake: QT += sql
首先需要在QT項目文件的*.pro文件中添加: QT += core gui sql
所用到的頭文件:
#include <qDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
1. 加載數據庫驅動
將libmysql.dll庫放到下面的目錄下: D:\QT\Qt5.10.1\5.10.1\mingw53_32\bin
//查看QT支持的驅動
qDebug() << QSqlDatabase::drivers();
輸出結果為:
//("QSQLITE", "QMYSQL", "QMYSQL3", "QOCI", "QOCI8", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
2. 設置賬號密碼
設置賬號和密碼信息使用QSqlDatabase類的成員函數:
void setHostName(const QString &host)
void setPassword(const QString &password)
void setPort(int port)
void setUserName(const QString &name)
void setDatabaseName(const QString &name)
使用方法, 如下所示
db.setHostName("192.168.10.145"); //設置mysql主機的IP地址
db.setDatabaseName("scott"); //設置數據庫名
db.setUserName("root"); //設置用戶名
db.setPassword("123456"); //設置密碼
其實上面這幾步就類似於登錄mysql數據庫需要的關鍵信息:
mysql -h192.168.10.145 -uroot -p123456 scott
3. 打開數據庫
bool QSqlDatabase::open()
詳情查看QT幫助手冊
使用方法, 如下所示:
if(!db.open())
{
qDebug() << "數據庫操作失敗";
return;
}
4.執行select查詢操作
1 需要使用QSqlQuery類的相關函數:
Header: #include <QSqlQuery>
2 QSqlQuery類的構造函數:
QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
該構造函數都有默認值, 構造的時候可以不指定:
用法: QSqlQuery query;
3 執行select查詢語句
3.1 第一種方法, 直接調用exec執行sql語句
例如: query.exec("select * from dept");
3.2 第二種方法,先調用prepare准備一個sql語句, 然后再執行exec執行sql語句
例如:
bool success;
query.prepare("select * from dept");
success = query.exec();
if(!success)
{
qDebug() << "查詢失敗";
return;
}
4 獲取查詢表的總字段數
先調用QSqlQuery類的record方法:
QSqlRecord record() const;
然后在調用QSqlRecord類的count方法
int QSqlRecord::count() const
例如:
QSqlRecord rec = query.record();
qDebug() << "查詢結果字段總數為:" << rec.count();
//注意: 有的函數有代碼示例, 可以直接參考
5 獲取查詢結果總記錄數
調用QSqlQuery類的size方法:
int size() const
例如:
qDebug() << "查詢結果記錄總數為" << query.size();
6 遍歷查詢的結果集
獲取每一條記錄:
bool QSqlQuery::next()
通過列的索引位置獲取列的值---列的索引從0開始
QVariant QSqlQuery::value(int index) const
通過列名獲取列的值:
QVariant value(const QString &name) const
代碼示例:
while(query.next())
{
//qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toString();
qDebug() << query.value("deptno").toInt() << query.value("dname").toString() <<
query.value("loc").toString();
}
7 移動指向結果集的位置指針:
bool QSqlQuery::seek(int index, bool relative = false)
例如:
query.seek(-1); //每次next都會使記錄指針移動一次, 可以使用seek函數重置指針位置,類似於文件指針
5. 執行insert操作
方法1:
query.prepare("insert into dept values(77, 'sports', 'xiuzheng')");
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "插入失敗:" << lastError.driverText() << lastError.databaseText();
return;
}
方法2: 使用帶有占位符的sql語句, 該語句不是一個完整的sql語句,需要調用bindValue函數給占位符設置值.
query.prepare("insert into dept values(?, ?, ?)");
//給字段設置值,字段位置索引從0開始
query.bindValue(0, 99);
query.bindValue(1, "SPORTS");
query.bindValue(2, "BEIJING");
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "插入失敗:" << lastError.driverText() << lastError.databaseText();
return;
}
方法3:直接調用exec並將sql語句作為參數也可以直接插入
success = query.exec("insert into dept values(66, 'SALES', 'SHANGHAI')");
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "插入失敗:" << lastError.driverText() << lastError.databaseText();
return;
}
6. 執行update操作
方法1:直接調用execl並將sql語句作為參數執行
success = query.exec("update dept set loc='MEIGUO' where deptno=99");
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
return;
}
方法2:使用帶有占位符占位符的sql語句
query.prepare("update dept set loc=? where deptno=?");
query.bindValue(0, "JAPAN");
query.bindValue(1, 77);
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
return;
}
7. 執行delete操作
方法1:直接調用execl並將sql語句作為參數執行
query.exec("delete from dept where deptno=99");
方法2:使用帶有占位符的sql語句
query.prepare("delete from dept where deptno=? or loc=?");
query.bindValue(0, 77);
query.bindValue(1, "SHANGHAI");
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
return;
}
8. 事務處理
1 開啟事務
query.exec("START TRANSACTION");
2 設置自動提交和手動提交---->默認情況下mysql是自動提交的
query.exec("SET AUTOCOMMIT=0"); //手動提交
query.exec("SET AUTOCOMMIT=1"); //自動提交
3 事務的提交和回滾操作
query.exec("COMMIT");
query.exec("ROLLBACK");
測試方法: 先開啟一個新的事務, 並設置為手動提交, 然后插入數據, 最后回滾, 看數據是否已經插入到數據庫中;然
后在修改為提交, 查看數據是否已經插入到數據庫中.
測試代碼如下:
query.exec("START TRANSACTION");
query.exec("SET AUTOCOMMIT=0"); //手動提交
success = query.exec("insert into dept values(99, 'SALES', 'SHANGHAI')");
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
//回滾事務
query.exec("ROLLBACK");
return;
}
//提交事務
query.exec("COMMIT");
9. 關閉數據庫
//關閉數據庫
db.close();