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

  

 

posted @ 2019-11-13 15:28  Citrusliu  阅读(368)  评论(0编辑  收藏  举报