首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
数据库
> 详细
C++操作oracle数据库
时间:
2016-10-15 16:49:28
阅读:
235
评论:
0
收藏:
0
[点我收藏+]
标签:
数据库操作方式
:可以采用ADO方式,也可以采用oracle本身提供的Proc*C/C++或者是OCCI方式操作数据库。
连接方式
:可以是客户端连接、也可以是服务器端连接。
数据库配置
:无论是何种连接都需要进行数据库连接的配置,一般在ORACLE_HOME下面的network/admin/tnsnames.ora文件中进行配置,如果没有此目录或者是此文件,需要自己手工添加。内容格式大致如下:
点击(
此处)折叠或打开
BM2D0
=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =
XXX.XXX.XXX.XXX
)(PORT
= 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =
BM2D0
)
)
)
其中
橄榄色可任意起名,一般在数据库连接是作为服务和用户名、密码一起确定数据库连接的参数。
第一个鲜粉色是远程oracle数据库所在服务器的IP地址,端口号一般为1521。
第二个鲜粉色是远程oracle所在主机的全局数据库名字,不能随意更改。
后两个搭配起来能够确定唯一连接对象。
客户端连接:
方式一:ADO
main.cpp
点击(
此处)折叠或打开
#include
"DBOperation.h"
#include
<iostream>
using namespace std;
void main()
{
CDBOperation dbOper;
bool bConn
=
dbOper.ConnToDB("Provider=OraOLEDB.Oracle.1;Persist Security Info=True;Data Source=xxx1",
"xxx2",
"xxx3");
if
(false
==
bConn)
{
printf("连接数据库出现错误\n");
system("PAUSE");
return;
}
_RecordsetPtr pRst;
//执行查询语句
//char
*sql
=
"select * from TSTUDENT";
char sql[255]
=
{0};
strcpy(sql,
"select * from TSTUDENT");
pRst
=
dbOper.ExecuteWithResSQL(sql);
if
(NULL
==
pRst)
{
printf("查询数据出现错误!\n");
system("PAUSE");
return;
}
if
(pRst->adoEOF)
{
pRst->Close();
printf("There is no records in this table\n");
return;
}
_variant_t vSno,
vName,
v***,
vAge,
vDno,
vDname,
vCname;
while
(!pRst->adoEOF)
{
//pRst->MoveFirst();
//记录集指针移动到查询结果集的前面
vSno
=
pRst->GetCollect(_variant_t((long)0));
vName
=
pRst->GetCollect(_variant_t("name"));
v***
=
pRst->GetCollect(_variant_t("***"));
vAge
=
pRst->GetCollect(_variant_t("age"));
//vDno
=
pRst->GetCollect("dno");
//vDname
=
pRst->GetCollect("dname");
//vCname
=
pRst->GetCollect("cname");
printf("%s\t%s\t%s\t%d\n",
(LPSTR)(LPCSTR)(_bstr_t)vSno,
(LPSTR)(LPCSTR)_bstr_t(vName),
(LPSTR)(LPCSTR)_bstr_t(v***),
vAge.intVal);
pRst->MoveNext();
}
//执行插入语句
//sprintf(sql,
"insert into TSTUDENT(sno, name, ***, age) values(‘%s‘, ‘%s‘, ‘%s‘, %d)",
"20080016",
"全局",
"女",
25);
strcpy(sql,
"insert into TSTUDENT(sno, name, ***, age) values(‘20080001‘, ‘全局‘, ‘女‘, 25)");
pRst
=
dbOper.ExecuteWithResSQL(sql);
if
(NULL
!=
pRst)
{
printf("插入数据成功\n");
}
//执行删除语句
sprintf(sql,
"delete from TSTUDENT where sno = ‘%s‘",
"20080017");
pRst
=
dbOper.ExecuteWithResSQL(sql);
if
(NULL
!=
pRst)
{
printf("删除数据成功\n");
}
system("PAUSE");
//pRst->Close();
}
其中XXX1:是tnsnames.ora中配置的服务名,XXX2是用户名,XXX3是密码。
DBOperation.h:
点击(
此处)折叠或打开
#pragma once
#import
"c:\program files\common files\system\ado\msado15.dll"
no_namespace rename("EOF",
"adoEOF")
class
CDBOperation
{
public:
//初始化数据库操作需要的对象
CDBOperation(void);
~CDBOperation(void);
//连接至数据库
bool ConnToDB(char
*ConnectionString,
char
*UserID,
char
*Password);
//数据库操作函数
//查询操作 删除以及添加
_RecordsetPtr ExecuteWithResSQL(const
char
*);
//bool ExecuteNoResSQL(const
char
*);//delete
and
add
private:
void PrintErrorInfo(_com_error
&);
private:
//初始化数据库连接、命令、记录集
_ConnectionPtr CreateConnPtr();
_CommandPtr CreateCommPtr();
_RecordsetPtr CreateRecsetPtr();
private:
//数据库连接需要的连接、命令操作对象
_ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
};
DBOperation.cpp
点击(
此处)折叠或打开
#include
"DBOperation.h"
CDBOperation::CDBOperation(void)
{
CoInitialize(NULL);
m_pConnection
=
CreateConnPtr();
m_pCommand
=
CreateCommPtr();
}
CDBOperation::~CDBOperation(void)
{
//m_pCommand->Close();
m_pConnection->Close();
}
bool CDBOperation::ConnToDB(char
*ConnectionString,
char
*UserID,
char
*Password)
{
if
(NULL
==
m_pConnection)
{
printf("Failed to create connection\n");
return
false;
}
try
{
HRESULT hr
=
m_pConnection->Open(ConnectionString,
UserID,
Password,
NULL);
if
(TRUE
==
FAILED(hr))
{
return
false;
}
m_pCommand->ActiveConnection
=
m_pConnection;
return
true;
}
catch(_com_error
&e)
{
PrintErrorInfo(e);
return
false;
}
}
_RecordsetPtr CDBOperation::ExecuteWithResSQL(const
char
*sql)
{
//已经在连接至数据库的时候进行判断了
//if
(NULL
==
m_pCommand
||
0
==
m_pConnection->State)
//{
// printf("Failed to create command OR the state of connection is zero\n");
// return
NULL;
//}
//char
*query
=
new char;
//strcpy(query,
sql);
try
{
m_pCommand->CommandText
=
_bstr_t(sql);
_RecordsetPtr pRst
=
m_pCommand->Execute(NULL,
NULL,
adCmdText);
return pRst;
//_variant_t ra;
//_RecordsetPtr pRst
=
m_pConnection->Execute((_bstr_t)query,
&ra,
adCmdText);
}
catch(_com_error
&e)
{
PrintErrorInfo(e);
return
NULL;
}
}
//bool CDBOperation::ExecuteNoResSQL(const
char
*sql)
//{
// //if
(NULL
==
m_pCommand
||
0
==
m_pConnection->State)
// //{
// // printf();
// //}
// try
// {
// char
*query
=
NULL;
// strcpy(query,
sql);
// m_pCommand->CommandText
=
(_bstr_t)query;
//
// }
//}
void CDBOperation::PrintErrorInfo(_com_error
&e)
{
printf("Error infomation are as follows\n");
printf("ErrorNo: %d\nError Message:%s\nError Source:%s\nError Description:%s\n",
e.Error(),
e.ErrorMessage(),
(LPCTSTR)e.Source(),
(LPCTSTR)e.Description());
}
_ConnectionPtr CDBOperation::CreateConnPtr()
{
HRESULT hr;
_ConnectionPtr connPtr;
hr
=
connPtr.CreateInstance(__uuidof(Connection));
if
(FAILED(hr)
==
TRUE)
{
return
NULL;
}
return connPtr;
}
_CommandPtr CDBOperation::CreateCommPtr()
{
HRESULT hr;
_CommandPtr commPtr;
hr
=
commPtr.CreateInstance(__uuidof(Command));
if
(FAILED(hr)
==
TRUE)
{
return
NULL;
}
return commPtr;
}
_RecordsetPtr CDBOperation::CreateRecsetPtr()
{
HRESULT hr;
_RecordsetPtr recsetPtr;
hr
=
recsetPtr.CreateInstance(__uuidof( Command));
if
(FAILED(hr)
==TRUE)
{
return
NULL;
}
return recsetPtr;
}
方式二:OCCI
默认oracle安装了occi库,但是只是安装了release版本的资源,因此需要将程序配置为release模式,或者是参看
http://www.189works.com/article-42057-1.html
为debug模式获取必备的头文件以及库文件,本文采用的是release模式,使用默认安装的库文件以及头文件。
1.修改配置属性
改为Rlease模式
2.添加库文件目录
$(ORACLE_HOME)\oci\include
3.添加头文件目录
$(ORACLE_HOME)\oci\lib
4.添加库文件:oraocci10.lib
应用程序:
点击(
此处)折叠或打开
//代码的目的就是验证makefile中oracle的头文件和lib文件路径是否正确了
#include
<iostream>
#define WIN32COMMON //避免函数重定义错误
#include
<occi.h>
using namespace std;
using namespace oracle::occi;
int
main()
{
Environment
*env=Environment::createEnvironment();
cout<<"success"<<endl;
string
name
=
"xxx";
string
pass
=
"xxx";
string
srvName
=
"xxx";
try
{
Connection
*conn
=
env->createConnection("bsm3",
"bsm3",
"BSM3");
cout<<"conn success"<<endl;
env->terminateConnection(conn);
}
catch(SQLException e)
{
cout<<e.what()<<endl;
system("pause");
return
-1;
}
Environment::terminateEnvironment(env);
cout<<"end!"<<endl;
system("pause");
return 0;
}
服务器端:AIX服务器
方式一:OCCI
helloworld.cpp
点击(
此处)折叠或打开
//代码的目的就是验证makefile中oracle的头文件和lib文件路径是否正确了
#include
<iostream>
#include
<occi.h>
using namespace std;
using namespace oracle::occi;
main()
{
Environment
*env=Environment::createEnvironment();
cout<<"success"<<endl;
string
name
=
"xxx";
string
pass
=
"xxx";
string
srvName
=
"xxx";
try
{
Connection
*conn
=
env->createConnection(name,
pass,
srvName);
cout<<"conn success"<<endl;
env->terminateConnection(conn);
}
catch(SQLException e)
{
cout<<e.what()<<endl;
}
Environment::terminateEnvironment(env);
cout<<"end!"<<endl;
}
Makefile:
点击(
此处)折叠或打开
###########################################
#Makefile
for
the OCCI demo programs
###########################################
INC=-I${ORACLE_HOME}/precomp/public
-I${ORACLE_HOME}/rdbms/public
LIB=-L${ORACLE_HOME}/lib
-locci #-bnoquiet #-bloadmap
FLAGS=-q64
-g
#为方便取下面三个变量,目标为helloworld,源文件是helloworld.cpp,编译后文件helloworld.o
PRG=helloworld
SRC=helloworld.cpp
OBJ=helloworld.o
#下面是常规的makefile内容,$@表示依次取目标执行,这里只有helloworld一个目标。实际等价于
#CC
-o helloworld helloworld.o 不过加入了include和lib文件。而helloworld.o需要后续完成
$(PRG):$(OBJ)
@echo
"begin link......"
${CC}
${FLAGS}
${INC}
${LIB}
-o $@ $(OBJ)
#helloworld目标依赖helloworld.o生成,所以该句就是编译.c生成.o文件。只不过加入了include和lib文件
$(OBJ):$(SRC)
@echo
"begin compile......"
${CC}
${FLAGS}
${INC}
${LIB}
-c $(SRC)
#后面的内容不是make的内容了,而是make clean内容。比如想重新make之前,清除.o等文件,执行make clean语句
#.PRNOY语句表明 clean关键词是个伪目标。make不自动执行。
.PRONY:clean
clean:
@echo
"Removing linked and compiled files....."
rm
-f $(OBJ)
$(PRG)
关于客户端以及服务器端采用PROC*C/C++连接方式待续。。。。
C++操作oracle数据库
标签:
原文地址:http://www.cnblogs.com/aabbcc/p/5964366.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
数据库进阶
2021-07-29
在 Oracle 数据库中执行 SQL 语句遇到特殊字符的转义方式
2021-07-28
Windows Logstash同步 Sqlserver 到Elasticsearch
2021-07-26
mysql数据库(11):恢复数据
2021-07-26
mysql数据库(9):常用查询的例子
2021-07-26
SQLAlchemy 多对多
2021-07-26
ClickHouse的JDBC连接
2021-07-26
Apache HBase 1.7.1 发布,分布式数据库
2021-07-26
数据库常用架构和同步工作原理
2021-07-26
MySQL数据库设计规范(仅供参考)
2021-07-26
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!