数据操作
连接数据库前的准备工作
如果想要通过外部客户端连接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;
}