alin的学习之路:在Qt中使用Oracle数据库

1. 准备工作

在Qt中安装好Source插件,将其中的oci模块进行编译,注意要在oci.pro中指定数据块的动态库和头文件路径

  • 需要在Qt项目文件中添加的模块名:

    qmake: QT += sql
    

2. 相关类和API

  • QSqlDatabase

    // 通过这个类添加/删除/复制/关闭数据库实例
    // 相关的api
    
    // 得到key使用的数据库驱动名字的集合
    [static] QStringList QSqlDatabase::drivers();
    // 函数输出: ("QSQLITE", "QMYSQL", "QMYSQL3", "QOCI", "QOCI8", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
    
    // 这个类的构造函数一般不使用, 添加数据库实例需要使用这个类的静态函数
    [static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ));
    参数:
    	- type: 指定要连接什么样的数据库(mysql, oracle, 其他...)
            - 调用静态函数 QSqlDatabase::drivers();得到数据库驱动名
            	- QMYSQL -> 连接mysql数据库
           		- QOCI   -> 连接oracle数据库
        - connectionName: 数据库连接名, 默认叫: defaultConnection
            - 通过这个名字就可以得到创建的数据库实例对象了
    返回值: 得到数据实例对象
    
    // 通过数据库连接名得到数据库实例对象
    [static] QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1String( defaultConnection ), bool open = true);
    参数:
    	- connectionName: 在 addDatabase()第二个参数指定的连接名
        - open: 实例的状态, true: 得到的实例设置为打开状态, false: 得到的实例设置为关闭状态
            
    // 判断连接名对应的连接是否已经存在了
    [static] bool QSqlDatabase::contains(const QString &connectionName = QLatin1String( defaultConnection ));
    
    // 通过QSqlDatabase数据库实例对象, 初始化连接信息
    // 设置数据库名, oracle的数据库名: orcl
    void QSqlDatabase::setDatabaseName(const QString &name);
    // 数据库服务器对应的IP地址
    // 如果是本地连接可以直接写 localhost, 127.0.0.1
    void QSqlDatabase::setHostName(const QString &host);
    // 数据库服务器绑定的端口, 如果数据库使用的就是默认端口, 这个函数可以不调用
    void QSqlDatabase::setPort(int port);
    // 连接的数据库中某个用户的用户名
    void QSqlDatabase::setUserName(const QString &name);
    // 连接的数据库中某个用户对应的密码
    void QSqlDatabase::setPassword(const QString &password);
    
    // 通过初始化的连接信息, 连接数据库
    bool QSqlDatabase::open();
    返回值: 
    	- 成功: true
        - 失败: false
            
    // 关闭数据库连接
    void QSqlDatabase::close();
    
    // 判断数据库是否打开了
    bool QSqlDatabase::isOpen() const;
    
    // 事务操作
    // 事务是一个操作的集合, 有可能涉及多次数据的修改(数据添加, 数据修改, 数据删除)
    // 开启一个事务
    bool QSqlDatabase::transaction();
    // 提交事务
    bool QSqlDatabase::commit();
    // 数据回滚
    bool QSqlDatabase::rollback();
    
  • 数据查询类 - QSqlQuery

    // 构造函数
    QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
    参数:
    	- query: 要执行的sql语句: 添删查改
    
    // 执行sql语句
    // 执行成功: true, 执行失败: false
    bool QSqlQuery::exec(const QString &query);
    // 执行的sql语句是在构造函数中进行的初始化
    bool QSqlQuery::exec();
    
    // 如果是查询光有成功/失败是不够的, 在成功之后, 需要得到查询的结果集, 
    // 结果集存储在当前的 QSqlQuery对象中
    // 遍历 QSqlQuery对象中的结果集 (多行多列), 每遍历一次得到一条记录(一行), 结果存储在 QSqlQuery 中
    // 结果集中还有记录返回true, 结果集读完了返回false
    // 第一次调用next()函数, 得到结果集中的第一行
    bool QSqlQuery::next();
    // 循环遍历
    while(query.next())
    {
        // 得到一条记录(一行)
        // 取出当前行每一个字段的值
        query.value(x).toxxx();
    }
    
    // 取出记录中的字段值(列值)
    // 通过字段的编号取出字段值, 从 0 开始, 数一下字段在结果集中的编号
    QVariant QSqlQuery::value(int index) const;
    // 通过字段名直接取出字段值
    QVariant QSqlQuery::value(const QString &name) const;
    

3. 实例程序

void test
{
    //打印所有的驱动
    //qDebug() << QSqlDatabase::drivers();

    //创建数据库对象,需要指定驱动
    QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
    //添加用户名,密码,ip地址,端口号
    db.setDatabaseName("orcl");
    db.setUserName("scott");
    db.setPassword("tiger");
    db.setHostName("192.168.31.52");
    //端口号可以不用设置,代表默认1521
    //设置完信息需要打开
    db.open();

    QString sql;
    sql = QString("select * from dept");
    //启动一个事务,也就是一个保存点
    db.transaction();
    // 创建查询对象
    QSqlQuery query;
    //执行查询语句
    bool bl = query.exec(sql);
    if(!bl)
    {
        db.rollback();
        qDebug() << "查询失败,原因:" << db.lastError().text();
    }
    while(query.next())
    {
        qDebug()<< query.value(0).toInt() << query.value(1).toString() << query.value(2).toString();
    }
    //关闭数据库
    db.close();
}

4. oracle 查询用户查询表

查看当前实例下的所有用户:select * from dba_users;

查看用户下的所有表:select table_name from user_tables;

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐