Qt - 数据库
数据库基本概念:
1、数据和数据库(DB)
数据库就是存放数据的仓库,例如关系型数据库是按照二维表结构方式组织的数据集合,二维表由行和列组成,表的行称为元组,列称为属性。
2、数据库管理系统(DBMS)
它是位于用户应用程序和操作系统之间的数据库管理系统软件(例如:Oracle、MySQL、SQL Server)。
数据库系统(DBS)通常由四部分组成:数据库、计算机硬件(支持DB存储和访问)、软件(操作系统、DBMS)、数据库管理员(DBA)。
数据库系统在实际应用中通常分为两种:桌面型、网络型。
3、结构化查询语句SQL
SQL语言由三部分组成:数据定义语言(创建、删除)、数据操纵语言(检索、修改)、数据控制语言(安全、权限)
4、表和视图
a、表:每个数据库包含若干个表,每个表都有一个表名。
表结构:每个表都有一定的结构(表的型,第一栏)。
记录:每个表都有若干行数据(表的值)。
字段:每个记录由若干数据项构成,将每个数据项称为字段(字段属性:字段名、字段数据类型、字段长度、是否为关键字)。
关键字:表中记录的某一字段或字段组合能够唯一标志记录,则称其为候选关键字。选定其中一个候选为关键字(也称主键)。
外关键字:若某字段或组合不是 A表 的关键字,但它是 B表 的关键字,则称该字段或组合为 A表 的外关键字(也称外键)反之也成立。
b、视图:视图时从一个或多个表(或视图)导出的表。
SQL命令:
数据查询:SELECT(查)
数据操作:INSERT(增)、UPDATE(改)、DELETE(删)
Qt提供的数据库模块sql;
Qt提供操作数据库的类:
1、QSqlQuery(直接执行任意SQL语句,并返回结果);
2、QSqlTableModel、QSqlRelationalTableModel(数据库操作接口)。
例子 1 代码:
以sqlite数据库(对应数据库驱动为QSQLITE)为例。(sqlite数据库是一种进程内的本地数据库,无须数据库名、用户名、密码、主机名、端口等特性)
//创建一个sqlite数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setHostName("127.0.0.1"); //设置数据库主机名(IP:Port) db.setDatabaseName("qtDB.db"); //设置数据库名 db.setUserName("zhouhejun"); //设置数据库用户名 db.setPassword("123456"); //设置数据库密码 db.open(); //打开连接
//创建数据库表(直接执行SQL语句) QSqlQuery query; bool success = query.exec("create table automobil(" "id int primary key," "attribute varchar," "type varchar," "kind varchar," "nation int," "carnumber int," "elevaltor int," "distance int," "oil int," "temperature int)"); if(success) { qDebug() << QObject::tr("数据库表创建成功!\n"); } else { qDebug() << QObject::tr("数据库表创建失败!\n"); }
//查 query.exec("select * from automobil");
//增 //批量插入避免将值转换为字符串:先调用prepare函数指定一个有占位符的query,然后绑定要插入的值 query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)"); long records = 100; for(int i = 0; i < records; i++) { query.bindValue(0, i); query.bindValue(1, "四轮"); query.bindValue(2, "轿车"); query.bindValue(3, "富康"); query.bindValue(4, rand() % 100); query.bindValue(5, rand() % 10000); query.bindValue(6, rand() % 300); query.bindValue(7, rand() % 200000); query.bindValue(8, rand() % 52); query.bindValue(9, rand() % 100); success = query.exec(); if(!success) { QSqlError lastError = query.lastError(); qDebug() << lastError.driverText() << QString(QObject::tr("插入失败")); } }
//改 for(int i = 0; i < records; i++) { query.clear(); query.prepare(QString("update automobil set attribute=?,type=?," "kind=?,nation=?," "carnumber=?,elevaltor=?," "distance=?,oil=?," "temperature=? where id=%1").arg(i)); query.bindValue(0, "四轮"); query.bindValue(1, "轿车"); query.bindValue(2, "富康"); query.bindValue(3, rand() % 100); query.bindValue(4, rand() % 10000); query.bindValue(5, rand() % 300); query.bindValue(6, rand() % 200000); query.bindValue(7, rand() % 52); query.bindValue(8, rand() % 100); success = query.exec(); if(!success) { QSqlError lastError = query.lastError(); qDebug() << lastError.driverText() << QString(QObject::tr("更新失败")); } }
//删 query.exec("delete from automobil where id=15");
//排序 success = query.exec("select * from automobil order by id desc"); if(success) { qDebug() << QObject::tr("排序 %1 条记录,耗时:%2 ms").arg(records).arg(t.elapsed()); } else { qDebug() << QObject::tr("排序失败!"); }