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数据库是一种进程内的本地数据库,无须数据库名、用户名、密码、主机名、端口等特性)
1 2 3 4 5 6 7 | //创建一个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(); //打开连接 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //创建数据库表(直接执行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" ); } |
1 2 | //查 query.exec( "select * from automobil" ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //增 //批量插入避免将值转换为字符串:先调用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( "插入失败" )); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //改 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( "更新失败" )); } } |
1 2 | //删 query.exec( "delete from automobil where id=15" ); |
1 2 3 4 5 6 7 | //排序 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( "排序失败!" ); } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性