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执行结果是:

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