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("排序失败!");
}
浙公网安备 33010602011771号