1、首先确定安装的oracle数据库是32位的还是64位的,在PLSQL Developer中通过此语句:SQL> select * from v$version;显示如下我的是32位
2、我使用的VS2008在选择Oracle中occi文件选择V8的:E:\Database\Orcal\product\11.2.0\dbhome_1\OCI\lib\MSVC\vc8下的oraocci11.dll,这些文件是安装oracle就有的,不需要再次下载。
3、将OCI文件中的所有文件复制到新建VS2008项目根目录下。
4、点击项目属性:C/C++的常规 附加包含目录下添加:..\ocilib\include,这是添加的是.h文件。
5、下面是我的ConnDB.h文件:
#include "stdafx.h"
//代码的目的就是验证makefile中oracle的头文件和lib文件路径是否正确了
#include <iostream>
#define WIN32COMMON //避免函数重定义错误
(注:这里引用的是oraocci11.lib只能使用Release不能使用Debug,如果使用Debug要引用oraocci11d.lib,这样引用的目的可以使用相对路径,移动别的电脑不用改变也能用)
#pragma comment(lib, "..\\ocilib\\lib\\MSVC\\vc8\\oraocci11.lib")//加入occi连接库(可以不在链接器依赖输入和附加库目录加入oraocci11.lib)
#include <occi.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
using namespace oracle::occi;
//表示引用了XP系统提供的ADO接口进行数据库操作
class ConnDB
{
public:
ConnDB();
virtual ~ConnDB();
public:
int OnInitConnDB();
void ExitConnect();
public:
Environment * env; //上下文件
Statement *pStmt; // SQL执行的Statement对象
Connection *conn; //连接数据库
};
6、下面是我的ConnDB.cpp文件:
// connOrcale.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "ConnDB.h"
ConnDB::ConnDB()
{
}
ConnDB::~ConnDB()
{
}
int ConnDB::OnInitConnDB()
{
///创建OCCI上下文环境
env = Environment::createEnvironment();
if (NULL == env) {
printf("createEnvironment error.\n");
return -1;
}
else
cout << "success" << endl;
string name = "rfiddata";//数据库用户名
string pass = "123456";//数据库密码
string srvName = "localhost:1521/orcl";//数据库服务名,这里使用的是localhost本地连接,如果使用ip的话,需要在oracle中设置
//E:\Database\Orcal\product\11.2.0\dbhome_1\NETWORK\ADMIN的listener.ora和tnsnames.ora中将(HOST = localhost)该成
(HOST = 自己电脑IP)然后再将所有打开服务重启下。
7、下面是我的connOrcale.cpp文件:try { //创建数据库连接 conn = env->createConnection(name, pass, srvName);//用户名,密码,数据库名 if (NULL == conn) { printf("createConnection error.\n"); return -1; } else cout << "conn success" << endl; // 数据操作,创建Statement对象 //Statement *pStmt = NULL; // Statement对象 pStmt = conn->createStatement(); if (NULL == pStmt) { printf("createStatement error.\n"); return -1; } } catch (SQLException e) { cout << e.what() << endl; system("pause"); return -1; } return 0; } void ConnDB::ExitConnect() { // 终止Statement对象 conn->terminateStatement(pStmt); // 关闭连接 env->terminateConnection(conn); // pEnv->terminateConnection(pConn); // 释放OCCI上下文环境 Environment::terminateEnvironment(env); cout << "end!" << endl; }
// connOrcale.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "ConnDB.h" int main() { system("pause");//暂停dos环境 ConnDB m_ConnDB; //申明连接 int conn =m_ConnDB.OnInitConnDB();//连接,等于0则连接成功 if(conn !=0)//不成功再次连接 { m_ConnDB.OnInitConnDB(); } // 查询数据库时间 std::string sno,name,sex; int age; ResultSet *pRs = m_ConnDB.pStmt->executeQuery( "select * from t_user"); while (pRs->next()) { sno = pRs->getString(1); name = pRs->getString(2); sex = pRs->getString(3); age = pRs->getInt(4); printf("db time:%s \n", sno.c_str()); printf("db time:%s \n", name.c_str()); printf("db time:%s \n", sex.c_str()); printf("db time:%d \n", age); // int类型取值用getInt() //break; } m_ConnDB.pStmt->closeResultSet(pRs); //--------插入--------- // 指定DML为自动提交 m_ConnDB.pStmt->setAutoCommit(TRUE);
string aaa; // 设置执行的SQL语句 //pStmt->setSQL("INSERT INTO TA (ID, NAME) VALUES (1, 'ZS')"); //pStmt->setSQL("insert into t_user(sno, name, sex, age)values('邓超', '99', '41',19)");
m_ConnDB.pStmt->setSQL("insert into readertime(rfiddevice, tagid, time)values('192.168.0.160', '123456', '123456')");// 设置执行的SQL语句 // 执行SQL语句 unsigned int nRet = m_ConnDB.pStmt->executeUpdate();if (nRet == 0) {printf("executeUpdate insert error.\n");}m_ConnDB.ExitConnect();system("pause");return 0;}//pStmt->setSQL("insert into t_user(sno, name, sex, age)values('邓超', '99', '“+aaa+”',19)");//变量时得这样才能引用
成功连接数据获取数据。