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