oracle数据库c++操作

数据操作

连接数据库前的准备工作

如果想要通过外部客户端连接oracle服务器, 必须先关闭防火墙。
通过linux命令关闭centos防火墙:

  • 第一种方式:
  # 工具 iptables
  # 安装工具iptables
  # 切换到root用户, -代表用户的环境变量一并切换
  su - root
  yum install iptables
  # 查看防火墙状态
  service iptables status
  # 打开防火墙
  service iptables start
  # 关闭防火墙
  service iptables stop
  • 第二种方式 -> 常用
  • 操作系统自带的, 不需要安装任何工具
  # 假设防火墙默认是开启的, 使用关闭命令关闭之后, 再重启系统, 防火墙还是启动的
  systemctl status firewalld
  # 启动防火墙 -> 临时设置, 重启系统会回复为默认设置
  systemctl start firewalld
  # 关闭防火墙 -> 临时设置, 重启系统会回复为默认设置
  systemctl stop firewalld
  # 永久设置
  # 防火墙启动
  systemctl enable firewalld
  # 防火墙关闭
  systemctl disable firewalld

启动oracle数据库

必须登录到oracle用户, 通过oracle用户对数据进行启动

  • 启动数据库
  # 通过sqlplus进行连接
  # 使用dba身份登录oracle的时候是不对密码进行验证的, 用户名使用system
  # 使用dba身份登录, 如果指定的用户名不是system也会默认使用system身份登录
  sqlplus 用户名/密码 as sysdba
  sqlplus system/xxx as sysdba
  # 启动数据库
  SQL> startup
  ORACLE instance started.
  
  Total System Global Area  759943168 bytes
  Fixed Size                  2217224 bytes
  Variable Size             549456632 bytes
  Database Buffers          205520896 bytes
  Redo Buffers                2748416 bytes
  Database mounted.
  Database opened.
  • 关闭数据库
  SQL> shutdown immediate
  • 设置tns监听
  $ lsnrclt start/stop

如果上述操作失败:

  启动tns监听失败:
  # 当前是oracle用户, 切换到root 用户
  hostname oracle
  # 退出root用户
  exit
  # 启动tns监听
  lsnrclt start

注意事项

mysql是基于数据库的数据库
oracle是基于用户的数据库

mysql在创建表的时候默认有一个用户是用root用户来创建的
oracle建表首先要新建一个新用户,oracle数据库实例是oral,新用户是在 oral 实例中创建的账户
mysql就是创建一个数据库在数据库下面去创建一个新的表

OCCI使用

vs案例

#include <iostream>
#include <occi.h>
using namespace std;
using namespace oracle::occi;

int main()
{
	// 初始化连接环境
	Environment* env = Environment::createEnvironment();
	// 根据环境对象, 创建一个连接数据库服务器的实例
	// 参数: 用户名->oracle数据库用户名, 密码, 连接串
	// 连接串(oracle服务器地址): IP:端口/实例名
	// 192.168.21.23:1521/orcl
	Connection* conn = env->createConnection("scott", "tiger", "192.168.237.166:1521/orcl");
	// 主要的业务逻辑 -> 数据库操作-> 使用sql语句
	// 创建能够操作sql的对象
	Statement* st = conn->createStatement();
	// 给st对象指定要操作的sql语句
	// 假设要查询
	string sql = "slect * from dept";
	// 知识设置, 没有查询
	st->setSQL(sql);
	// 执行sql语句
	// 返回ResultSet对象, 这个类中保存了查询到的结果
	ResultSet* result = st->executeQuery();
	// 遍历结果集, 使用next()
	while (result->next())
	{
		// 将当前记录的字段值取出
		// 看数据库表的设计 -> 需要要知道每个字段对应的数据类型
		// 取值的方法: get数据类型(字段在数据表中的位置[从1开始算]);
		cout << "no: " << result->getInt(1) << ","
			<< "name: " << result->getString(2) << ","
			<< "location: " << result->getString(3) << endl;
	}
	// 关闭查询的结果集 -> 释放资源closeResult
	st->closeResultSet(result);
	// 数据库插入
	sql = "insert into dept values(33, '索隆', '和之国')";
	st->setSQL(sql);
	// 获取事务模式是否开启
	bool bl = st->getAutoCommit();
	cout << "bl: " << bl << endl;	// 这个值默认是false
	// 开启事务
	// st->setAutoCommit(true);
	int ret = st->executeUpdate();
	cout << "insert return value: " << ret << endl;
	if (ret <= 0)
	{
		// 操作失败
		// 状态回滚 -> rollback, 由数据库实例对象调用
		conn->rollback();
	}
	else
	{
		conn->commit();
	}
	// 销毁statment对象
	conn->terminateStatement(st);
	// 销毁连接对象
	env->terminateConnection(conn);
	// 释放创建的环境对象
	Environment::terminateEnvironment(env);

	return 0;
}

qt案例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qDebug() << QSqlDatabase::drivers();
    // 添加数据库实例
    QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
    // 设置连接信息
    db.setHostName("192.168.237.166");  // 主机地址
    db.setPort(1521);   // 如果是默认端口, 可以不设置
    db.setDatabaseName("orcl"); // 数据库名
    db.setUserName("scott");
    db.setPassword("tiger");

    // 连接数据库
    if(db.open())
    {
        qDebug() << "数据库连接成功";
        // 数据库查询
        QSqlQuery q;
        QString sql = "select * from dept";
        bool bl = q.exec(sql);
        if(!bl)
        {
            qDebug() << "查询失败";
        }
        else
        {
            // 遍历结果
            while(q.next())
            {
                // 取出当前记录中的字段
                qDebug() << "no:" << q.value("deptno").toInt()
                         <<"name: " << q.value("dname").toString()
                         <<"location: " << q.value("loc").toString();
            }
        }
        // 插入数据
        sql = "insert into dept values(55, '艾斯', '东京')";

        QSqlDatabase db1 = QSqlDatabase::database();
        db1.transaction();
        bl = q.exec(sql);
        if(bl==false)
        {
            qDebug() << "插入失败";
            db1.rollback();
        }
        else
        {
            qDebug() << "插入数据成功";
            db1.commit();
        }

    }
    else
    {
        qDebug() << "数据库连接失败";
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值