使用ocilib库访问oracle数据库
来源:互联网 发布:知乎提问怎么取消匿名 编辑:程序博客网 时间:2024/06/03 22:46
- 下面是一个简单的建立数据库连接的代码:
#include "ocilibDemo.h"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)) );}void conn(){ OCI_Connection *cn; if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT)) return; cn = OCI_ConnectionCreate(tnsName, user, password, OCI_SESSION_DEFAULT); if (cn != NULL) { printf(OCI_GetVersionServer(cn)); printf("Server major version : %i\n", OCI_GetServerMajorVersion(cn)); printf("Server minor version : %i\n", OCI_GetServerMinorVersion(cn)); printf("Server revision version : %i\n", OCI_GetServerRevisionVersion(cn)); printf("Connection version : %i\n", OCI_GetVersionConnection(cn)); /* ... application code here ... */ OCI_ConnectionFree(cn); } OCI_Cleanup(); return; }
其中err_handler是作为异常处理函数,会在数据库error发生时被调用。
注意ocilib代码在编译时要设置宏/DOCI_API=__stdcall和/DOCI_CHARSET_XXX,XXX是具体字符集类型有三种:
1. OCI_CHARSET_ANSI : all strings are in ANSI
2. OCI_CHARSET_UNICODE : all strings are Unicode (versions of Oracle> = 9i)
3. OCI_CHARSET_MIXED : SQL statements + metadata are in ANSI, user data and resultset data in Unicode
客户端和服务器端最好都统一设置ANSI或者UNICODE,避免麻烦。
- 数据库操作代码
void createTable(){ OCI_Statement *st = NULL; OCI_Connection *cn; if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT)) return; cn = OCI_ConnectionCreate(tnsName, user, password, OCI_SESSION_DEFAULT); if (cn!=NULL) { st = OCI_StatementCreate(cn); char sql[]=MT("create table test_table ") MT("( ") MT("val_int number, ") MT("val_flt float, ") MT("val_str varchar2(30), ") MT("val_date date") MT(")"); cout<<"Create table:\n"<<sql<<endl; OCI_ExecuteStmt(st, sql); OCI_ConnectionFree(cn); } OCI_Cleanup();}void dropTable(){ OCI_Statement *st = NULL; OCI_Connection *cn; if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT)) return; cn = OCI_ConnectionCreate(tnsName, user, password, OCI_SESSION_DEFAULT); if (cn!=NULL) { st = OCI_StatementCreate(cn); char sql[]=MT("drop table test_table"); cout<<"Drop table:\n"<<sql<<endl; OCI_ExecuteStmt(st, sql); OCI_ConnectionFree(cn); } OCI_Cleanup();}void insertBind(){ OCI_Date *date; int i; double flt; OCI_Statement *st = NULL; OCI_Connection *cn; if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT)) return; cn = OCI_ConnectionCreate(tnsName, user, password, OCI_SESSION_DEFAULT); if (cn!=NULL) { st = OCI_StatementCreate(cn); char sql[]=MT("insert into test_table ") MT("( ") MT(" val_int, val_flt, val_str, val_date") MT( ") " ) MT( "values ") MT( "( ") MT( " :val_int, :val_flt, :val_str, :val_date") MT(") "); cout<<"Intsert table:\n"<<sql<<endl; OCI_Prepare(st, sql); i = 1; flt = 3.14; string s="sfsdfsdfsfsdfsdfsd"; date = OCI_DateCreate(cn); OCI_DateSysDate(date); OCI_BindInt(st, MT(":val_int"), &i); OCI_BindDouble(st, MT(":val_flt"), &flt); OCI_BindString(st, MT(":val_str"), const_cast<char *>(s.c_str()), 30); OCI_BindDate(st, MT(":val_date"), date); OCI_Execute(st); OCI_DateFree(date); OCI_Commit(cn); OCI_ConnectionFree(cn); } OCI_Cleanup();}void insertArray(){ OCI_Connection *cn; OCI_Statement *st; OCI_Error *err; int count=20000000; int batchSize=5000; int tab_int[batchSize]; double tab_flt[batchSize]; char tab_str[batchSize][31]; OCI_Date* tab_date[batchSize]; int i; if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT)) return; cn = OCI_ConnectionCreate(tnsName, user, password, OCI_SESSION_DEFAULT); st = OCI_StatementCreate(cn); OCI_Prepare(st, "insert into test_table values(:i, :f, :s, :t)"); OCI_BindArraySetSize(st, batchSize); OCI_BindArrayOfInts(st, ":i", tab_int, 0); OCI_BindArrayOfDoubles(st, ":f", tab_flt, 0); OCI_BindArrayOfStrings(st, ":s", (char*) tab_str, 30, 0); OCI_BindArrayOfDates(st,":t",tab_date,0); for (i=0;i<batchSize;i++) { tab_int[i] = i+1; tab_flt[i]=3.14; sprintf(tab_str[i],"Name %d",i+1); tab_date[i] = OCI_DateCreate(cn); OCI_DateSysDate(tab_date[i]); } int round=count/batchSize; clock_t start=clock(); cout<<start<<endl; for (int j=0;j<round;j++) { if (!OCI_Execute(st)) { printf("Number of DML array errors : %d\n", OCI_GetBatchErrorCount(st)); err = OCI_GetBatchError(st); while (err) { printf("Error at row %d : %s\n", OCI_ErrorGetRow(err), OCI_ErrorGetString(err)); err = OCI_GetBatchError(st); } } OCI_Commit(cn);// printf("row processed : %d\n", OCI_GetAffectedRows(st)); } clock_t stop=clock(); cout<<stop<<endl; int costTime=stop-start; double numberPerSec=(count/costTime)*1000; cout<<"Insert records "<<count<<" cost time "<<costTime<<" ms"<<endl; cout<<"Insert records "<<numberPerSec<<"records/s "<<endl; for (i=0;i<batchSize;i++) { OCI_DateFree(tab_date[i]); } OCI_Commit(cn); OCI_ConnectionFree(cn); OCI_Cleanup(); return;}
ocilib的代码可以跑在装有Oracle client或instant client的任何机器上,通过tns访问数据库,如果是instant client注意设置tns和home路径。
1 0
- 使用ocilib库访问oracle数据库
- C++使用ocilib访问oracle数据库
- 使用oci封装库ocilib访问oracle
- C++使用ocilib访问oracle的函数
- 使用 OCILIB 连接并操作 Oracle 数据库
- Oracle数据库开发——使用OCILIB
- C++使用 OCILIB 连接 Oracle
- VS2013下C++调用ocilib访问oracle
- CPP/VCPP_连接Oracle数据库-OCILIB
- OCILIB 连接Oracle数据库——注意事项
- C++使用ocilib直连oracle
- 在LINUX上使用OCILIB连接ORACLE数据库失败的问题
- c 语言使用ocilib连接 orale数据库
- OCILIB使用
- OCILIB 连接Oracle数据库——安装配置
- OCILIB 连接Oracle数据库——插入数据
- Linux 环境下调用C++库ocilib操作Oracle数据
- 初涉OCILIB的使用
- 静态顺序表------C语言实现
- 为什么BeanFactory对象可以用ApplicaionContext对象的实例进行实例化
- 性能测试实施(1)之团队组建
- 关于指针的一点知识和九度oj1518
- 经典算法题:大数据处理常见算法题
- 使用ocilib库访问oracle数据库
- springmvc常用注解标签详解
- SignalR简介
- Codeforces 513F2 题解 (网络流-最大流 二分 BFS)
- 《第一行代码》学习笔记
- Kth Largest Element in an Array(数组中第K大元素)
- fdisk 命令与parted 命令的区别
- Linux学习之——/etc/sysconfig目录
- jquery 获取多个具有相同name的checkbox的选中的值