#include <QtSql>
QT += sql
QSqlDatabase類實現(xiàn)了數(shù)據(jù)庫連接的操作
QSqlQuery類執(zhí)行SQL語句
QSqlRecord類封裝數(shù)據(jù)庫所有記錄
QSqlDatabase類
- QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
- db.setHostName("localhost"); //數(shù)據(jù)庫主機名
- db.setDatabaseName("scott"); //數(shù)據(jù)庫名
- db.setUserName("stott"); //數(shù)據(jù)庫用戶名
- db.setPassword("tiger"); //數(shù)據(jù)庫密碼
- db.open(); //打開數(shù)據(jù)庫連接
- db.close(); //釋放數(shù)據(jù)庫連接
建立數(shù)據(jù)庫文件
- QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
- db.setDatabaseName("database.db");
- if (!db.open())
- {
- qDebug("數(shù)據(jù)庫不能打開");
- }
- return false;
- 建立數(shù)據(jù)庫文件后創(chuàng)建表并插入兩條數(shù)據(jù)
- QSqlQuery query;
- query.exec("create table student(id INTEGER PRIMARY KEY autoincrement,
- name nvarchar(20), age int)"); //id自動增加
- query.exec("insert into student values(1,'小明', 14)");
- query.exec("insert into student values(2,'小王',15)");
QSqlQuery類
插入值到數(shù)據(jù)庫操作
一、直接用SQL語句插入(參照上面)
二、利用預處理方式插入(ORACLE語法和ODBC語法)
適合插入多條記錄,或者避免將值轉(zhuǎn)換成字符串(即正確地轉(zhuǎn)義),調(diào)用prepare()函數(shù)指定一個包含占位符的query,然后綁定要插入的值
ORACLE語法
- QSqlQuery query;
- query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //準備執(zhí)行SQL查詢
- query.bindValue(":name", "小王"); //在綁定要插入的值
- query.bindValue(":age", 11);
- query.exec();
ODBC語法
- QSqlQuery query;
- query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //準備執(zhí)行SQL查詢
- query.addBindValue("小王"); //在綁定要插入的值
- query.bindValue(11);
- query.exec();
三、批量插入到數(shù)據(jù)庫中
- QSqlQuery query;
- query.prepare(“insert into student values (?, ?)”);
- QVariantList names;
- names << "小王" << "小明" << "小張" << "小新"; // 如果要提交空串,用QVariant(QVariant::String)代替名字
- query.addBindValue(names);
- QVariantList ages;
- ages << 11 << 13 << 12 << 11;
- query.addBindValue(ages);
- if (!q.execBatch()) //進行批處理,如果出錯就輸出錯誤
- qDebug() << q.lastError();
查詢數(shù)據(jù)庫操作
- QSqlQuery query;
- query.exec("SELECT * FROM t_STUDENT"); // 查詢的結(jié)果可能不止一條記錄,所以我們稱之為結(jié)果集
- while (query.next())
- {
- QString name = query.value(0).toString(); //取第i條記錄第1個字段(從0開始計數(shù))的結(jié)果
- int age = query.value(0).toInt(); //取第i條記錄第2個字段的結(jié)果
- // ... 處理name,age變量數(shù)據(jù)
- }
seek(int n) :query指向結(jié)果集的第n條記錄。指定當前的位置
first() :query指向結(jié)果集的第一條記錄。
last() :query指向結(jié)果集的最后一條記錄。
next() :query指向下一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的下一條記錄。
previous() :query指向上一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的上一條記錄。
record() :獲得現(xiàn)在指向的記錄。
value(int n) :獲得屬性的值。其中n表示你查詢的第n個屬性
int rowNum = query.at(); //獲取query所指向的記錄在結(jié)果集中的編號
int fieldNo = query.record().indexOf(“name”); //返回"name"的列號
int columnNum = query.record().count(); //獲取每條記錄中屬性(即列)的個數(shù)
事務操作
操作函數(shù):transaction(),commit()提交,rollback()回滾
操作事務前,先判斷該數(shù)據(jù)庫是否支持事務操作。hasFeature是QSQLDriver類函數(shù)
- if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //
插入一條記錄,然后提交事務
- QSqlDatabase::database().transaction();
- QSqlQuery query;
- query.exec("SELECT id FROM T_STUDENT WHERE class=1");
- if (query.next())
- {
- query.exec("INSERT INTO T_STUDENT (id,name,age) VALUES (3,'小李',13)");
- }
- QSqlDatabase::database().commit();