1.QSqlDatabase類
QSqlDatabase類提供了一個接口,用於通過連接訪問數據。QSqlDatabase的一個實例表示連接。該連接通過受支持的數據庫驅動程序之一提供對數據庫的訪問,該驅動程序派生自QSqlDriver。
1.1創建數據庫
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("yzl.db");
if (!database.open()) {
QMessageBox::warning(0, QObject::tr("Database Error"),
database.lastError().text());
}
else
{
QMessageBox::information(this,"","open success");
}
如果目錄下沒有該文件,則會在本目錄下生成,否則連接該文件。比如:
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("abc.db");//當前目錄下沒有abc.db
if (!database.open()) {
QMessageBox::warning(0, QObject::tr("Database Error"),
database.lastError().text());
}
else
{
QMessageBox::information(this,"","open success");
}
創建成功後,該文件默認爲空的,然後就可以使用QSqlQuery類來操作該數據庫, QSqlQuery類使用的是SQL語句,如果只需要使用高層次的數據庫接口(不關心 SQL 語法),可以選擇 QSqlTableModel 和QSqlRelationalTableModel。
2.QSqlQuery類
2.1.作用:
QSqlQuery類提供了一種執行和操作SQL語句的方法。
QSqlQuery封裝了在QSqlDatabase上執行的SQL查詢中創建,導航和檢索數據所涉及的功能 ,它能執行DML(Data manipulation language)語句,類似SELECT、INSERT、UPDATE、DELETE和DLL(data defintion language)語句,類似於CREATE TABLE,DML是用來處理數據的增刪改查的,而DLL是用來創造數據和修改數據結構的,一個是對數據的實例做操作,不會影響到數據結構,一個是從頂層對數據結構進行操作。
另外在QSqlQuery裏面提到了一些可以執行一些非標準的命令
如果執行一個SQL statements成功,則會把query實例的狀態轉換爲true,可以用isActive()查看狀態
導航功能主要用到以下的函數next(),previous(),first(),last(),seek()。方便的遍歷整個數據record,如果只是需要向前,可以使用setForwardOnly(),當一個active query用在了一個有效的record上時,就可以採用value()返回data value。注意返回值是QVariant類型。
2.2頭文件
Header: |
#include <QSqlQuery> |
qmake: |
QT += sql .pro文件中需添加 |
2.3
通過exec()成員函數來執行DML(數據操作語言)語句,如SELECT、INSERT、UPDATE和DELETE,以及DDL(數據定義語言)語句等。
小例子
1).例1
QString querysql = QString::fromLocal8Bit("GUI_遙信控件");
QSqlQuery query;
query.exec(QString("DROP TABLE %1").arg(querysql));
2).例2
QSqlQuery query(database);
query.exec(QString("select count(*) from sqlite_master where type = 'table' and name = '%1'; ").arg(querysql));
while (query.next())
{
int count = query.value(0).toInt();
qDebug() << "count: "<<count;
}
2.4創建表
例1:
QSqlQuery query;
QString sqlQuery = QString::fromLocal8Bit("CREATE TABLE stu("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name VCHAR(40) NOT NULL,"
"score INTEGER NOT NULL,"
"class VCHAR(40) NOT NULL)");
query.exec(sqlQuery);
結果:
例2:
QString tablename = QString::fromLocal8Bit("遙控控件");
QString col1name = QString::fromLocal8Bit("界面編號");
QString col2name = QString::fromLocal8Bit("控件編號");
QString col3name = QString::fromLocal8Bit("遙信編號");
QString sqlstr = QString::fromLocal8Bit("CREATE TABLE %1("
"%2 INTEGER PRIMARY KEY AUTOINCREMENT,"
"%3 INTEGER NOT NULL,"
"%4 INTEGER NOT NULL)").arg(tablename).arg(col1name).arg(col2name).arg(col3name);
bool ret = query.exec(sqlstr);
結果:
2.5 插入數據
例1:
QString sqlstr = "INSERT INTO stu (name,score,class)"
"VALUES ('xiaozhang',67,'3-1')";
bool ret = query.exec(sqlstr);
結果:
例2:
QString tablename = QString::fromLocal8Bit("遙控控件");
QString col1name = QString::fromLocal8Bit("界面編號");
QString col2name = QString::fromLocal8Bit("控件編號");
QString col3name = QString::fromLocal8Bit("遙信編號");
QString sqlstr = QString("INSERT INTO %1 (%2,%3,%4)"
"VALUES (59,6,9)").arg(tablename).arg(col1name).arg(col2name).arg(col3name);
bool ret = query.exec(sqlstr);
結果:
2.6 批量導入數據
如果我們有大串數據需要導入時,也可以使用prepare()來綁值,然後再通過bindValue()向綁值加入數據。
//批量導入
QStringList names;
names << QString::fromLocal8Bit("李紅")<< QString::fromLocal8Bit("張亮")<< QString::fromLocal8Bit("李梅");
QStringList classes;
classes << QString::fromLocal8Bit("初1-1班") << QString::fromLocal8Bit("初3-5班") << QString::fromLocal8Bit("初2-9班");
query.prepare("INSERT INTO stu(name,score,class) VALUES(:name,:score,:class)");
foreach (QString n,names)
{
query.bindValue(":name",n);
query.bindValue(":score",(qrand() % 101));
query.bindValue(":class",classes[(qrand()%classes.length())]);
query.exec();
}
結果:
2.7查詢數據
query.exec("select * from stu where score > 70");
while (query.next())
{
int id = query.value(0).toInt();
QString name = query.value(1).toString();
QString score = query.value(2).toString();
QString classes = query.value(3).toString();
qDebug() << id << name << score << classes;
}
結果:
3 "張亮" "72" "初3-5班"
4 "李梅" "80" "初3-5班"
2.8刪除表中數據
刪表內容有3個語句:
- DROP: 用來刪除整表,並且連表結構也會刪除,刪除後則只能使用CREATE TABLE來重新創建表
- TRUNCATE: 在SQLite中沒有該語句,在MySQL中有該語句,用來清楚表內數據,但是表結構不會刪除.
- DELETE: 刪除部分記錄,並且表結構不會刪除,刪除的速度比上面兩個語句慢,可以配合WHERE來刪除指定的某行
例
query.exec("DELETE FROM stu WHERE id = 3");
結果:
例,清除表中內容
query.exec("DELETE FROM students");
結果:
2.9修改表內容
改表內容一般用下面兩個語句:
- UPDATE : 用來修改表中內容,可以通過WHERE語句來指定修改
- ALTER TABLE: 用來重命名錶,或者在已有的表中添加新的一列
例 將stu表格重命名爲student
query.exec("ALTER TABLE stu RENAME TO student");
結果:
2.10 UPDATE
query.exec("UPDATE student SET score=100,name='xiaozhang'");
結果:
3.sqlite_master
sqlite會自動維護一個系統表sqlite_master,該表存儲了我們所創建的各個table, view, trigger等等信息。
sqlite_master表數據字段:
type: 類型,取值一般爲table, view
name:
tbl_name: 表名
rootpage:
sql:創建表或者視圖的sql語句,可以從該sql語句中判斷某字段是否存在
sqlite_master表結構如下:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
例如:
select * from sqlite_master where type = 'table' and name = 't_cmpt_cp'
sql執行結果是: