• Qt之SQL数据库


    ----------------------------

    http://blog.csdn.net/reborntercel/article/details/6991147

    http://blog.csdn.net/fzu_dianzi/article/details/6959268

    --------------------------------

    需要说明,当刚执行完query.exec(“select * from student”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from student”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。

     #include <QtSql>
    QT += sql
    QSqlDatabase类实现了数据库连接的操作
    QSqlQuery类执行SQL语句
    QSqlRecord类封装数据库所有记录

    QSqlDatabase类

    1. QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");  
    2. db.setHostName("localhost");    //数据库主机名   
    3. db.setDatabaseName("scott");    //数据库名   
    4. db.setUserName("stott");        //数据库用户名   
    5. db.setPassword("tiger");        //数据库密码   
    6. db.open();          //打开数据库连接  
    7. db.close();         //释放数据库连接  

    建立数据库文件

    1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
    2. db.setDatabaseName("database.db");  
    3. if (!db.open())   
    4. {  
    5.     qDebug("数据库不能打开");  
    6. }  
    7. return false;  
    1. 建立数据库文件后创建表并插入两条数据  
    1. QSqlQuery query;  
    2. query.exec("create table student(id INTEGER PRIMARY KEY autoincrement,  
    3.             name nvarchar(20), age int)"); //id自动增加  
    4. query.exec("insert into student values(1,'小明', 14)");  
    5. query.exec("insert into student values(2,'小王',15)");  


    QSqlQuery类

    插入值到数据库操作

    一、直接用SQL语句插入(参照上面)

    二、利用预处理方式插入(ORACLE语法和ODBC语法)

    适合插入多条记录,或者避免将值转换成字符串(即正确地转义),调用prepare()函数指定一个包含占位符的query,然后绑定要插入的值

    ORACLE语法

    1. QSqlQuery query;   
    2. query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //准备执行SQL查询  
    3. query.bindValue(":name", "小王");   //在绑定要插入的值  
    4. query.bindValue(":age", 11);   
    5. query.exec();  


    ODBC语法

    1. QSqlQuery query;  
    2. query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //准备执行SQL查询  
    3. query.addBindValue("小王");   //在绑定要插入的值  
    4. query.bindValue(11);  
    5. query.exec();  

    三、批量插入到数据库中

    1. QSqlQuery query;  
    2. query.prepare(“insert into student values (?, ?)”);  
    3. QVariantList names;  
    4. names << "小王" << "小明" << "小张" << "小新"; // 如果要提交空串,用QVariant(QVariant::String)代替名字  
    5. query.addBindValue(names);  
    6. QVariantList ages;  
    7. ages << 11 << 13 << 12 << 11;  
    8. query.addBindValue(ages);  
    9. if (!q.execBatch()) //进行批处理,如果出错就输出错误  
    10.     qDebug() << q.lastError();  


    查询数据库操作

    1. QSqlQuery query;  
    2. query.exec("SELECT * FROM t_STUDENT"); // 查询的结果可能不止一条记录,所以我们称之为结果集  
    3. while (query.next())  
    4. {  
    5.     QString name = query.value(0).toString(); //取第i条记录第1个字段(从0开始计数)的结果  
    6.     int age = query.value(0).toInt(); //取第i条记录第2个字段的结果  
    7.     // ... 处理name,age变量数据   
    8. }  


    seek(int n) :query指向结果集的第n条记录。指定当前的位置

    first() :query指向结果集的第一条记录。

    last() :query指向结果集的最后一条记录。

    next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。

    previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。

    record() :获得现在指向的记录。

    value(int n) :获得属性的值。其中n表示你查询的第n个属性

    int rowNum = query.at(); //获取query所指向的记录在结果集中的编号

    int fieldNo = query.record().indexOf(“name”); //返回"name"的列号

    int columnNum = query.record().count(); //获取每条记录中属性(即列)的个数

    事务操作

    操作函数:transaction(),commit()提交,rollback()回滚
    操作事务前,先判断该数据库是否支持事务操作。hasFeature是QSQLDriver类函数

    1. if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //   

     插入一条记录,然后提交事务

      1. QSqlDatabase::database().transaction();  
      2. QSqlQuery query;  
      3. query.exec("SELECT id FROM T_STUDENT WHERE class=1");  
      4. if (query.next())  
      5. {  
      6.     query.exec("INSERT INTO T_STUDENT (id,name,age) VALUES (3,'小李',13)");  
      7. }  
      8. QSqlDatabase::database().commit();  
  • 相关阅读:
    CentOS 7.4 发布下载,安全稳定的Linux发行版
    PHP缓存机制详解
    用FastDFS一步步搭建文件管理系统
    linux中mv命令使用详解
    linux grep命令详解
    音频放大器的设计
    C#学习笔记(九)——集合、比较和转换
    Kinect学习笔记(五)——更专业的深度图
    C#学习笔记(八)——定义类的成员
    kinect学习笔记(四)——各种数据流
  • 原文地址:https://www.cnblogs.com/584709796-qq-com/p/5013679.html
Copyright © 2020-2023  润新知