42.QT-QSqlQuery类操做SQLite数据库(建立、查询、删除、修改)详解

Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操做。这里咱们所说的“平台
独立”,既包括操做系统平台,也包括各个数据库平台,Qt支持如下几种数据库:html

 

  • QT自带SQLITE数据库,不须要再安装
  • QTDS在Qt4.7起已经被移除

 

1.QtSqlsql

要使用QtSql 模块的话,须要在.pro文件中添加这么一句:数据库

QT += sql 

 

2.QSqlDatabaseapp

QSqlDatabase类提供了一个接口,用于经过链接访问数据。QSqlDatabase的一个实例表示链接。该链接经过受支持的数据库驱动程序之一提供对数据库的访问,该驱动程序派生自QSqlDriver。函数

2.1 建立一个数据库示例以下工具

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(QApplication::applicationDirPath()+"/scooters.dat");    //若是本目录下没有该文件,则会在本目录下生成,不然链接该文件
 if (!db.open()) { QMessageBox::warning(0, QObject::tr("Database Error"), db.lastError().text()); return false; }

编译运行后,能够看到已经建立了该文件:spa

 

建立成功后,该文件默认为空的,而后就可使用QSqlQuery类来操做该数据库, QSqlQuery类使用的是SQL语句,若是只须要使用高层次的数据
库接口(不关心 SQL 语法),咱们能够选择 QSqlTableModel 和
QSqlRelationalTableModel(在后续章节介绍)。本章咱们介绍 QSqlQuery 类,来如何使用SQL语法.操作系统

 

3.QSqlQuery类介绍3d

经过exec()成员函数来执行DML(数据操做语言)语句,如SELECT、INSERT、UPDATE和DELETE,以及DDL(数据定义语言)语句等.code

好比:

QSqlQuery query; query.exec("DROP TABLE students");    //删除名为students的表

4.接下来,咱们讲讲如何导入数据

建立表:

query.exec("CREATE TABLE students ("
                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                   "name VARCHAR(40) NOT NULL, "
                   " score INTEGER NOT NULL, "
                   "class VARCHAR(40) NOT NULL)"); //建立一个students表,标题分别为id、name、score、class

" PRIMARY KEY AUTOINCREMENT,":表示该列为整数递增,若是为空时则自动填入1,而后在下面的每一行都会自动+1, PRIMARY KEY则表示该列做为列表的主键,经过它能够轻易地获取某一行数据

" INTEGER ":表示该列为带符号的整数

" VARCHAR(40) ":表示该列为可变长字符串,默认只能存储英文和数字或者utf-8,最多存储40个字节.

"NOT NULL ":表示该列的内容不为空

 

导入数据:

query.exec("INSERT INTO students (name, score,class) "
               "VALUES ('小张', 85, '初2-1班')"); //向students表里的(name, score,class)标题下插入一项数据'小张', 85, '初2-1班'

添加后以下图所示:

 

 

 

5.批量导入库

若是咱们有大串数据须要导入时,也可使用prepare()来绑值,而后再经过bindValue()向绑值加入数据

示例代码以下所示:

QStringList names; names<<"小A"<<"小B"<<"小C"<<"小D"<<"小E"<<"小F"<<"小G"
           <<"小H"<<"小I"<<"小G"<<"小K"<<"小L"<<"小M"<<"小N"; QStringList clases; clases<<"初1-1班"<<"初1-2班"<<"初1-3班"<<"初2-1班"
         <<"初2-2班"<<"初2-3班"<<"初3-1班"<<"初3-2班"<<"初3-3班"; QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(QApplication::applicationDirPath()+"/scooters.dat");     //在本目录下生成 QSqlQuery query; query.exec("DROP TABLE students");        //先清空一下表 query.exec("CREATE TABLE students ("
                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                   "name VARCHAR(40) NOT NULL, "
                   " score INTEGER NOT NULL, "
                   "class VARCHAR(40) NOT NULL)"); //建立一个students表
 query.prepare("INSERT INTO students (name, score,class) "
                  "VALUES (:name, :score, :class)"); //为每一列标题添加绑定值

    foreach (QString name, names)       //从names表里获取每一个名字 { query.bindValue(":name", name);                      //向绑定值里加入名字 query.bindValue(":score", (qrand() % 101));      //成绩 query.bindValue(":class", clases[qrand()%clases.length()] );    //班级 query.exec(); //加入库中 }

运行后,经过SQLite工具打开students.dat,以下图所示:

 

 

6.查询表内容

咱们对上图生成的students.dat文件进行查询内容时,则须要使用WHERE 关键字实现.

示例-查询成绩值为60~80之间的学生:

query.exec("SELECT * FROM students WHERE score >= 60 AND score <= 80;"); while(query.next()) { QString id = query.value(0).toString(); QString name = query.value(1).toString(); QString score = query.value(2).toString(); QString classs = query.value(3).toString(); qDebug()<<id<<name<<score<<classs; }

运行打印:

 

固然还有其它语句,好比:

"SELECT * FROM students WHERE score >= 80 OR class == '初3-3班';"
       //判断成绩大于等于80,或者班级为初3-3班的

打印以下图所示:

 

"SELECT * FROM students WHERE class GLOB '*3-3*';"
            // GLOB表示通配符,匹配班级带有"3-3"的名字

打印以下图所示:

 

 

PS:若是想查询全部内容,则改成 query.exec("SELECT * FROM students ");

 

7.删表内容

删表内容有3个语句:

  • DROP:          用来删除整表,而且连表结构也会删除,删除后则只能使用CREATE TABLE来从新建立表
  • TRUNCATE:   在SQLite中没有该语句,在MySQL中有该语句,用来清楚表内数据,可是表结构不会删除.
  • DELETE:      删除部分记录,而且表结构不会删除,删除的速度比上面两个语句慢,能够配合WHERE来删除指定的某行

示例1

query.exec("DELETE FROM students");           //删除students表里全部内容

删除后以下图所示:

 

示例2-删除id=3的一行

query.exec("DELETE FROM students WHERE id = 3");

删除前:

 

删除后:

 

 

8.改表内容

改表内容通常用下面两个语句:

  • UPDATE :      用来修改表中内容,能够经过WHERE语句来指定修改
  • ALTER  TABLE:  用来重命名表,或者在已有的表中添加新的一列

8.1 ALTER 示例

示例1

query.exec("ALTER TABLE students RENAME TO new_students");      //将students重命名为new_students

运行后以下图所示:

 

 

 示例2

query.exec("ALTER TABLE new_students ADD COLUMN 结果 VARCHAR(10)"); //向 new_students表里添加新的一列,标题为结果,内容格式为VARCHAR

运行后以下图所示:

 

 

8.2 UPDATE 示例

示例1-不使用WHERE,直接修改某列

query.exec("UPDATE new_students SET score = 100 , name = '小A'"); //修改score和name所在的列内容

修改后以下图所示:

 

 

示例2-使用WHERE,判断小于60的设为不合格,不然设为合格

query.exec("UPDATE new_students SET 结果='不合格' WHERE score<60 "); query.exec("UPDATE new_students SET 结果='合格' WHERE score>=60 ");

修改前以下图所示:

 

修改后:

 

 

原文出处:https://www.cnblogs.com/lifexy/p/10921958.html

相关文章
相关标签/搜索