最近公司有个项目需要用到Oracle数据库,我负责前期的调研。由于项目要用到C和PHP两种语言,所以先收集这两种语言连接Oracle的方法。PHP使用的是Laravel框架,直接使用了Laravel-OCI8进行数据库连接,毫无压力的连接成功了。C使用的是Ocilib进行数据库连接,在这里踩了几个坑,卡了几天,今天有空整理下,防止下次继续掉坑。
提示:本文使用的是win7 64位去连接远程的 Oracle 11g数据库
OCILIB介绍
OCILIB是一个跨平台的Oracle驱动程序,可提供非常快速和可靠地访问Oracle数据库。它提供了一个丰富,功能齐全,并易于使用的API 。OCILIB 支持运行的所有Oracle平台。
OCI环境搭建
由于OCILIB是对OCI进行二次封装,所以在使用OCILIB前,需要安装OCI环境,我们只要安装好Instant Client就能完成OCI环境的搭建。
Instant Client下载
首先我们从官方下载自己系统所对应的Instant Client,由于我的系统是win7 64位的,所以选择了 Instant Client for Microsoft Windows (x64)
下的 instantclient-basic-windows.x64-12.1.0.2.0.zip
提示:页面下需要点击 Accept License Agreement 后才能开始下载。
Instant Client安装
我们将下载的文件解压到电脑任意位置(本文将以解压到 D:\instantclient_12_1 为例),然后添加以下环境变量:
- path => D:\instantclient_12_1
- TNS_ADMIN => D:\instantclient_12_1
- NLS_LANG => SIMPLIFIED CHINESE_CHINA.ZHS16GBK
提示:path如果已经存在值的话,直接在尾部追加。
下载OCILIB
直接从Github上下载最新版即可,下载完成后将文件解压到任意位置(本文将以解压到 **C:\ocilib **为例)。
VS2010配置
- 点击
项目
-属性
-配置管理器
,新建一个X64平台(因为我下载的Instant Client是64位的,所以要用x64平台) - 点击
项目
-属性
-配置属性
-VC++ 目录
,在 包含目录 添加 C:\ocilib\include - 点击
项目
-属性
-配置属性
-链接器
-常规
,在 附加库目录 添加 C:\ocilib\lib64
示例代码
#include "stdafx.h"
#include "ocilib.h"
#if defined(OCI_CHARSET_WIDE)
#pragma comment(lib, "ocilibw.lib")
#elif defined(OCI_CHARSET_ANSI)
#pragma comment(lib, "ociliba.lib")
#endif
void err_handler(OCI_Error *err)
{
printf(
"code : ORA-%05i\n"
"msg : %s\n"
"sql : %s\n",
OCI_ErrorGetOCICode(err),
OCI_ErrorGetString(err),
OCI_GetSql(OCI_ErrorGetStatement(err))
);
}
int main(int argc, _TCHAR* argv[])
{
OCI_Connection* cn;
OCI_Statement* st;
OCI_Resultset* rs;
OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
cn = OCI_ConnectionCreate("192.168.1.152:1521/TEST", "system", "123456", OCI_SESSION_DEFAULT);
if(cn == NULL){
err_handler(OCI_GetLastError());
printf("%i",OCI_GetVersionServer(cn));
printf("连接失败!\n");
}
st = OCI_StatementCreate(cn);
OCI_ExecuteStmt(st, "select id,age from web_user");
rs = OCI_GetResultset(st);
while (OCI_FetchNext(rs)){
printf("code: %i, name %s\n", OCI_GetInt(rs, 1) , OCI_GetString(rs, 2));
}
printf("\n%d row(s) fetched\n", OCI_GetRowCount(rs));
OCI_Cleanup();
char a[20];
gets(a);
return EXIT_SUCCESS;
}
提示:程序运行时如果提示 计算机中丢失 ocilib*.dll,这里由于程序找不到ocilib*.dll造成的,只要将 C:\ocilib\lib64 加入path或者将 C:\ocilib\lib64 下的 ocilib*.dll 复制到程序目录就可以解决了。
来源:oschina
链接:https://my.oschina.net/u/924096/blog/756205