天天看點

QT筆記:資料庫總結(一)

 #include <QtSql>

QT += sql

QSqlDatabase類實作了資料庫連接配接的操作

QSqlQuery類執行SQL語句

QSqlRecord類封裝資料庫所有記錄

QSqlDatabase類

QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("localhost"); 	//資料庫主機名 
db.setDatabaseName("scott"); 	//資料庫名 
db.setUserName("stott"); 		//資料庫使用者名 
db.setPassword("tiger"); 		//資料庫密碼 
db.open();			//打開資料庫連接配接
db.close();			//釋放資料庫連接配接
           

建立資料庫檔案

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");
if (!db.open()) 
{
    qDebug("資料庫不能打開");
}
return false;
           
建立資料庫檔案後建立表并插入兩條資料
           
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類

插入值到資料庫操作

一、直接用SQL語句插入(參照上面)

二、利用預處理方式插入(ORACLE文法和ODBC文法)

适合插入多條記錄,或者避免将值轉換成字元串(即正确地轉義),調用prepare()函數指定一個包含占位符的query,然後綁定要插入的值

ORACLE文法

QSqlQuery query; 
query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //準備執行SQL查詢
query.bindValue(":name", "小王");   //在綁定要插入的值
query.bindValue(":age", 11); 
query.exec();
           

ODBC文法

QSqlQuery query;
query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //準備執行SQL查詢
query.addBindValue("小王");   //在綁定要插入的值
query.bindValue(11);
query.exec();
           

三、批量插入到資料庫中

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();
           

查詢資料庫操作

QSqlQuery query;
query.exec("SELECT * FROM t_STUDENT"); // 查詢的結果可能不止一條記錄,是以我們稱之為結果集
while (query.next())
{
    QString name = query.value(0).toString(); //取第i條記錄第1個字段(從0開始計數)的結果
    int age = query.value(0).toInt(); //取第i條記錄第2個字段的結果
    // ... 處理name,age變量資料 
}
           

seek(int n) :query指向結果集的第n條記錄。指定目前的位置

first() :query指向結果集的第一條記錄。

last() :query指向結果集的最後一條記錄。

next() :query指向下一條記錄,每執行一次該函數,便指向相鄰的下一條記錄。

previous() :query指向上一條記錄,每執行一次該函數,便指向相鄰的上一條記錄。

record() :獲得現在指向的記錄。

value(int n) :獲得屬性的值。其中n表示你查詢的第n個屬性

int rowNum = query.at(); //擷取query所指向的記錄在結果集中的編号

int fieldNo = query.record().indexOf(“name”); //傳回"name"的列号

int columnNum = query.record().count(); //擷取每條記錄中屬性(即列)的個數

事務操作

操作函數:transaction(),commit()送出,rollback()復原

操作事務前,先判斷該資料庫是否支援事務操作。hasFeature是QSQLDriver類函數

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();