加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++使用 OCILIB 连接 Oracle(解决OCCI中getstring()出错的问题)

(2013-01-15 16:39:42)
标签:

oci

oracle

c

分类: ITprogrammer
用Oracle自带的OCCI连接数据库,使用getstring()时候出现错误,网上各种解决方法,但是没有一个可行的,直到我看到一个和我碰到类似问题的外国朋友的留言:I ditched OCCI interface and adopted OCILIB。才恍然大悟,如果有类似困扰的朋友,赶紧抛弃OCCI,奔向OCILIB吧

去http://www.oschina.net/news/35997/ocilib-3-11-1(开源中国)下载OCILIB的最新版本,当然也可以直接去OCILIB的网站下。

简单配置之后就可以使用了,里面附带了各种DEMO,下面给个转载来的较为简单的例子:

#include
#include "ocilib.h"

//错误处理
void err_handler(OCI_Error *err)
{
    int   err_type = OCI_ErrorGetType(err);
    char *err_msg  = (char*)OCI_ErrorGetString(err);

    printf("%s - %s\n", err_type == OCI_ERR_WARNING ? "warning" : "error", err_msg);
}

int main(int argc, char *argv[])
{
    int nRet = 0;
    OCI_Connection* cn = NULL;
    OCI_Statement* st = NULL;
    OCI_Resultset* rs = NULL;
   
    //初始化OCI库
    nRet = OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
    if(!nRet)
    {
        std::cout << "OCI_Initialize fail" << std::endl;
        return -1;
    }
   
    do
    {
        std::cout << "compile version:" << OCI_GetOCICompileVersion() << std::endl;

        std::cout << "runtime version:" << OCI_GetOCIRuntimeVersion() << std::endl;

        //建立联接:tns:cctt1;username:d10086;password:d10086
        cn = OCI_ConnectionCreate("cctt1", "D10086", "D10086", OCI_SESSION_DEFAULT);
        if(NULL == cn)
        {
            std::cout << "OCI_ConnectionCreate fail" << std::endl;
            err_handler(OCI_GetLastError());
            nRet = -2;
            break;
        }

        printf("Server major    version : %i\n",   OCI_GetServerMajorVersion(cn));
        printf("Server minor    version : %i\n",   OCI_GetServerMinorVersion(cn));
        printf("Server revision version : %i\n\n", OCI_GetServerRevisionVersion(cn));
        printf("Connection      version : %i\n\n", OCI_GetVersionConnection(cn));

        //建立声明
        st = OCI_StatementCreate(cn);
        if(NULL == st)
        {
            std::cout << "OCI_StatementCreate fail" << std::endl;
            err_handler(OCI_GetLastError());
            nRet = -3;
            break;
        }

        //绑定变量
        char *value = "E3";
        //准备SQL语句,用 :value 占位符占位
        if(!OCI_Prepare(st, "select * from tb_smss_message where smsid=:value"))
        {
            std::cout << "OCI_Prepare fail" << std::endl;
            err_handler(OCI_GetLastError());
            nRet = -4;
            break;
        }
        //绑定变量,用变量替换占位符
        if(!OCI_BindString (st, ":value", value, strlen(value)))
        {
            std::cout << "OCI_BindString fail" << std::endl;
            err_handler(OCI_GetLastError());
            nRet = -5;
            break;
        }
        //执行声明
        if(!OCI_Execute(st))
        {
            std::cout << "OCI_Execute fail" << std::endl;
            err_handler(OCI_GetLastError());
            nRet = -6;
            break;
        }


       
        //得到返回值集
        rs = OCI_GetResultset(st);
        if(NULL == rs)
        {
            std::cout << "OCI_GetResultset fail" << std::endl;
            err_handler(OCI_GetLastError());
            nRet = -5;
            break;
        }
       
        //枚举返回值集
        while (OCI_FetchNext(rs))
        {
            printf("%i - %s\n", OCI_GetString(rs, 1), OCI_GetString(rs,2));
        }
    }while(0);
   
    //释放返回集
    if(rs)
        OCI_ReleaseResultsets (st);
   
    //清除声明
    if(st)
        OCI_StatementFree(st);
   
    //清除连接
    if(cn)
        OCI_ConnectionFree (cn);
   
    //清除OCI库
    OCI_Cleanup();
   
    return EXIT_SUCCESS;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有