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("排序失败!");                                          
}                                                                              

  

 

posted @   Citrusliu  阅读(369)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示