Qt數(shù)據(jù)庫(kù) 利用QSqlQuery類(lèi)執(zhí)行SQL語(yǔ)句 下篇
Qt數(shù)據(jù)庫(kù) 利用QSqlQuery類(lèi)執(zhí)行SQL語(yǔ)句 下篇是本節(jié)介紹的內(nèi)容,接著上篇文章繼續(xù)講 Qt數(shù)據(jù)庫(kù) 利用QSqlQuery類(lèi)執(zhí)行SQL語(yǔ)句 中篇,先來(lái)看內(nèi)容。
三,批處理操作。
當(dāng)要進(jìn)行多條記錄的操作時(shí),我們就可以利用綁定進(jìn)行批處理??聪旅娴睦?。
- void Widget::on_pushButton_clicked()
- {
- QSqlQuery q;
- q.prepare(“insert into student values (?, ?)”);
- QVariantList ints;
- ints << 10 << 11 << 12 << 13;
- q.addBindValue(ints);
- QVariantList names;
- names << “xiaoming” << “xiaoliang” << “xiaogang” << QVariant(QVariant::String);
- //***一個(gè)是空字符串,應(yīng)與前面的格式相同
- q.addBindValue(names);
- if (!q.execBatch()) //進(jìn)行批處理,如果出錯(cuò)就輸出錯(cuò)誤
- qDebug() << q.lastError();
- //下面輸出整張表
- QSqlQuery query;
- query.exec(“select * from student”);
- while(query.next())
- {
- int id = query.value(0).toInt();
- QString name = query.value(1).toString();
- qDebug() << id << name;
- }
- }
然后在widget.cpp文件中添加頭文件 #include <QSqlError> 。
我們?cè)诔绦蛑欣昧斜泶鎯?chǔ)了同一屬性的多個(gè)值,然后進(jìn)行了值綁定。***執(zhí)行execBatch()函數(shù)進(jìn)行批處理。注意程序中利用QVariant(QVariant::String)來(lái)輸入空值NULL,因?yàn)榍懊娑际荙String類(lèi)型的,所以這里要使用QVariant::String 使格式一致化。
運(yùn)行效果如下:
四,事務(wù)操作。
事務(wù)是數(shù)據(jù)庫(kù)的一個(gè)重要功能,所謂事務(wù)是用戶(hù)定義的一個(gè)數(shù)據(jù)庫(kù)操作序列,這些操作要么全做要么全不做,是一個(gè)不可分割的工作單位。在Qt中用transaction()開(kāi)始一個(gè)事務(wù)操作,用commit()函數(shù)或rollback()函數(shù)進(jìn)行結(jié)束。commit()表示提交,即提交事務(wù)的所有操作。具體地說(shuō)就是將事務(wù)中所有對(duì)數(shù)據(jù)庫(kù)的更新寫(xiě)回到數(shù)據(jù)庫(kù),事務(wù)正常結(jié)束。rollback()表示回滾,即在事務(wù)運(yùn)行的過(guò)程中發(fā)生了某種故障,事務(wù)不能繼續(xù)進(jìn)行,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫(kù)的所有已完成的操作全部撤銷(xiāo),回滾到事務(wù)開(kāi)始時(shí)的狀態(tài)。
如下面的例子:
- void Widget::on_pushButton_clicked()
- {
- if(QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions))
- { //先判斷該數(shù)據(jù)庫(kù)是否支持事務(wù)操作
- QSqlQuery query;
- if(QSqlDatabase::database().transaction()) //啟動(dòng)事務(wù)操作
- {
- //
- //下面執(zhí)行各種數(shù)據(jù)庫(kù)操作
- query.exec(“insert into student values (14, ‘hello’)”);
- query.exec(“delete from student where id = 1″);
- //
- if(!QSqlDatabase::database().commit())
- {
- qDebug() << QSqlDatabase::database().lastError(); //提交
- if(!QSqlDatabase::database().rollback())
- qDebug() << QSqlDatabase::database().lastError(); //回滾
- }
- }
- //輸出整張表
- query.exec(“select * from student”);
- while(query.next())
- qDebug() << query.value(0).toInt() << query.value(1).toString();
- }
- }
然后在widget.cpp文件中添加頭文件 #include <QSqlDriver> 。
QSqlDatabase::database()返回程序前面所生成的連接的QSqlDatabase對(duì)象。hasFeature()函數(shù)可以查看一個(gè)數(shù)據(jù)庫(kù)是否支持事務(wù)。
運(yùn)行結(jié)果如下:
可以看到結(jié)果是正確的。
對(duì)SQL語(yǔ)句我們就介紹這么多,其實(shí)Qt中提供了更為簡(jiǎn)單的不需要SQL語(yǔ)句就可以操作數(shù)據(jù)庫(kù)的方法,我們?cè)谙乱还?jié)講述這些內(nèi)容。本文章原創(chuàng)于www.yafeilinux.com
小結(jié):Qt數(shù)據(jù)庫(kù) 利用QSqlQuery類(lèi)執(zhí)行SQL語(yǔ)句 下篇的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!更多關(guān)于數(shù)據(jù)庫(kù)的操作請(qǐng)看編輯推薦。