QT筆記:數據庫總結(一)

 #include <QtSql>
QT += sql
QSqlDatabase類實現了數據庫連接的操作
QSqlQuery類執行SQL語句
QSqlRecord類封裝數據庫所有記錄

QSqlDatabase類

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");  
  2. db.setHostName("localhost");    //數據庫主機名   
  3. db.setDatabaseName("scott");    //數據庫名   
  4. db.setUserName("stott");        //數據庫用戶名   
  5. db.setPassword("tiger");        //數據庫密碼   
  6. db.open();          //打開數據庫連接  
  7. db.close();         //釋放數據庫連接  

建立數據庫文件

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
  2. db.setDatabaseName("database.db");  
  3. if (!db.open())   
  4. {  
  5.     qDebug("數據庫不能打開");  
  6. }  
  7. return false;  
  1. 建立數據庫文件後創建表並插入兩條數據  
  1. QSqlQuery query;  
  2. query.exec("create table student(id INTEGER PRIMARY KEY autoincrement,  
  3.             name nvarchar(20), age int)"); //id自動增加  
  4. query.exec("insert into student values(1,'小明', 14)");  
  5. query.exec("insert into student values(2,'小王',15)");  


QSqlQuery類

插入值到數據庫操作

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

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

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

ORACLE語法

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


ODBC語法

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

三、批量插入到數據庫中

  1. QSqlQuery query;  
  2. query.prepare(“insert into student values (?, ?)”);  
  3. QVariantList names;  
  4. names << "小王" << "小明" << "小張" << "小新"// 如果要提交空串,用QVariant(QVariant::String)代替名字  
  5. query.addBindValue(names);  
  6. QVariantList ages;  
  7. ages << 11 << 13 << 12 << 11;  
  8. query.addBindValue(ages);  
  9. if (!q.execBatch()) //進行批處理,如果出錯就輸出錯誤  
  10.     qDebug() << q.lastError();  


查詢數據庫操作

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


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類函數

  1. if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //   

 插入一條記錄,然後提交事務

  1. QSqlDatabase::database().transaction();  
  2. QSqlQuery query;  
  3. query.exec("SELECT id FROM T_STUDENT WHERE class=1");  
  4. if (query.next())  
  5. {  
  6.     query.exec("INSERT INTO T_STUDENT (id,name,age) VALUES (3,'小李',13)");  
  7. }  
  8. QSqlDatabase::database().commit();  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章