QT SQLite數據庫的操作


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執行結果是:

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