Windows下怎么访问ORACLE 最快,ADO? ODBC? ProC?? 的确oci是最快的bde都比ado快odbc最慢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我看了一下,ProC是在 OCI上封装了一层,那应该是比较快的了,那谁有没有例程,ProC中有没有连接句柄这种概念? #include <stdio.h>#include <stdlib.h>#include <string.h>#include <sqlca.h>#include <sqlda.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <time.h>#include <dlfcn.h>#include <stdarg.h>EXEC SQL INCLUDE SQLCA;EXEC SQL INCLUDE ORACA.H;EXEC ORACLE OPTION(RELEASE_CURSOR=YES);int ConnectDB(){ EXEC SQL WHENEVER SQLERROR GOTO err; EXEC SQL BEGIN DECLARE SECTION; VARCHAR un[20]; VARCHAR pw[20]; EXEC SQL END DECLARE SECTION; strcpy((char*)un.arr, USERNAME); un.len = strlen((char*)un.arr); strcpy((char*)pw.arr, PASSWORD); pw.len = strlen((char*)pw.arr); EXEC SQL CONNECT :un IDENTIFIED BY :pw; return SNY_OK;err: return SNY_NOTOK; }int CloseDB(){ EXEC SQL WHENEVER SQLERROR GOTO err; EXEC SQL COMMIT RELEASE; return SNY_OK;err: return SNY_NOTOK;}int main(){ EXEC SQL BEGIN DECLARE SECTION; VARCHAR thedate[20]; EXEC SQL END DECLARE SECTION; if (ConnectDB() == -1) { printf("module *** ConnectDB Error.\n"); return SNY_NOTOK; } EXEC SQL WHENEVER SQLERROR GOTO error; EXEC SQL WHENEVER NOT FOUND GOTO notFound; EXEC SQL DECLARE cur CURSOR FOR SELECT time_end FROM log ORDER BY name; EXEC SQL OPEN cur; memset((void*)&thedate, 0, sizeof(thedate)); EXEC SQL FETCH cur INTO :thedate; while(sqlca.sqlcode==0) { printf("date:%s\n", thedate.arr); memset((void*)&thedate, 0, sizeof(thedate)); EXEC SQL FETCH cur INTO :thedate; }notFound: EXEC SQL CLOSE cur; printf("is ok!\n\n"); if (CloseDB() == -1) { printf("module *** CloseDB Error.\n"); return SNY_NOTOK; } return 0; error: printf("\nError: %.70s \n",sqlca.sqlerrm.sqlerrmc); if (CloseDB() == -1) { printf("module *** CloseDB Error.\n"); return SNY_NOTOK; } return 0;} oci的连接: OCISession *authp = (OCISession *) 0; OCIServer *srvhp; OCISvcCtx *svchp; (void) OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ); (void) OCIEnvInit( (OCIEnv **) &envhp, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 ); (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0); /* server contexts */ (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0); (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0); (void) OCIServerAttach( srvhp, errhp, (text *)"", strlen(""), 0); /* set attribute server context in the service context */ (void) OCIAttrSet( (dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp, (ub4) 0, OCI_ATTR_SERVER, (OCIError *) errhp); (void) OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp, (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0); (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION, (dvoid *) username, (ub4) strlen((char *)username), (ub4) OCI_ATTR_USERNAME, errhp); (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION, (dvoid *) password, (ub4) strlen((char *)password), (ub4) OCI_ATTR_PASSWORD, errhp); checkerr(errhp, OCISessionBegin ( svchp, errhp, authp, OCI_CRED_RDBMS, (ub4) OCI_DEFAULT)); (void) OCIAttrSet((dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX, (dvoid *) authp, (ub4) 0, (ub4) OCI_ATTR_SESSION, errhp); ado使用ODBC连接,ODBC是通用接口,速度慢效率比较odbc<pro*c<oci怀疑oracle公司某些工具就是使用oci开发的 去orafaq.com看看吧,空口无凭 oci: oracle call interface 的缩写,也就是类似 API 这个含义如果你能不通过oracle的编程接口“直接操作”数据库的文件那自然更快,你明白oracle的文件结构的话 我原来不清楚的是sqllib 库是不是最终也是使用oci 调用,因为我觉得这样对oracle 来讲似乎更经济,不用同时维护两个功能相识的接口.刚才再查了些资料后才知道两者最后都会使用叫UPI的接口(User Programmatic Interface )PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER. OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. oci 虽然用起来好像很繁,但封装和代码管理起来都比pro*c好得多 ,目前已经有一些现成的封装类(如ociwrap),用起来比pro*c 还简单.9i 还提供了一个在oci 上的c++封装工具OCCI,使用ott 能把数据表直接转换为c++ 类,连访问代码都包含在其中了,感觉上挺方便的,不知道有那位用过的能谈一下经验.上面是摘的一断话:原文http://itpub.net/showthread.php?s=&threadid=64113 to biti_rainy:oci并不是直接操纵数据库的文件,PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER. OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. 都需要sqlnet解析,也就是说oracle只有一个接口SQLNET,任何操作都是建立在SQLNET之上的 楼上的,我几时说过 oci 是直接操作 数据库的文件了???我早交代过这个问题我说如果你能直接操作数据库文件,那样当然可以很快,但是,你能么?我想你一定是把我的话读错意思了 :)我既然把后面的 PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER. OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. 都交代出来了还不至于犯这样的错误吧 :) 关于创建视图中,我想修改视图中其中一个字段的类型,如何做? Oracle求触发器写法 新手菜鸟问题:如何把ORACLE数据表导出到WORD或者EXCEL中?在线等.. 求ORACLE10G的非官网下载地址 急!一些题目及询问Oracle9i版本问题 求一sql语句或函数(oracle),谢谢 Oracle导出导入 OMS服务启动不了,说什么Windows内部错误,急啊! 请问一个返回表中值得问题!!! 怎么把EXCEL数据导入oracel中,可不可以举个例子? 基础问题(小问题)? 如何实现以下功能?
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>
#include <sqlda.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <dlfcn.h>
#include <stdarg.h>EXEC SQL INCLUDE SQLCA;
EXEC SQL INCLUDE ORACA.H;
EXEC ORACLE OPTION(RELEASE_CURSOR=YES);int ConnectDB()
{
EXEC SQL WHENEVER SQLERROR GOTO err;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR un[20];
VARCHAR pw[20];
EXEC SQL END DECLARE SECTION;
strcpy((char*)un.arr, USERNAME);
un.len = strlen((char*)un.arr);
strcpy((char*)pw.arr, PASSWORD);
pw.len = strlen((char*)pw.arr);
EXEC SQL CONNECT :un IDENTIFIED BY :pw;
return SNY_OK;err:
return SNY_NOTOK;
}int CloseDB()
{
EXEC SQL WHENEVER SQLERROR GOTO err;
EXEC SQL COMMIT RELEASE;
return SNY_OK;err:
return SNY_NOTOK;
}int main()
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR thedate[20];
EXEC SQL END DECLARE SECTION;
if (ConnectDB() == -1)
{
printf("module *** ConnectDB Error.\n");
return SNY_NOTOK;
}
EXEC SQL WHENEVER SQLERROR GOTO error;
EXEC SQL WHENEVER NOT FOUND GOTO notFound;
EXEC SQL DECLARE cur CURSOR FOR
SELECT time_end FROM log ORDER BY name; EXEC SQL OPEN cur;
memset((void*)&thedate, 0, sizeof(thedate));
EXEC SQL FETCH cur INTO :thedate; while(sqlca.sqlcode==0)
{
printf("date:%s\n", thedate.arr);
memset((void*)&thedate, 0, sizeof(thedate));
EXEC SQL FETCH cur INTO :thedate;
}
notFound:
EXEC SQL CLOSE cur;
printf("is ok!\n\n");
if (CloseDB() == -1)
{
printf("module *** CloseDB Error.\n");
return SNY_NOTOK;
}
return 0;
error:
printf("\nError: %.70s \n",sqlca.sqlerrm.sqlerrmc);
if (CloseDB() == -1)
{
printf("module *** CloseDB Error.\n");
return SNY_NOTOK;
}
return 0;
}
OCISession *authp = (OCISession *) 0;
OCIServer *srvhp;
OCISvcCtx *svchp;
(void) OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0,
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0 ); (void) OCIEnvInit( (OCIEnv **) &envhp, OCI_DEFAULT, (size_t) 0,
(dvoid **) 0 ); (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR,
(size_t) 0, (dvoid **) 0); /* server contexts */
(void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER,
(size_t) 0, (dvoid **) 0); (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX,
(size_t) 0, (dvoid **) 0); (void) OCIServerAttach( srvhp, errhp, (text *)"", strlen(""), 0); /* set attribute server context in the service context */
(void) OCIAttrSet( (dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp,
(ub4) 0, OCI_ATTR_SERVER, (OCIError *) errhp); (void) OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp,
(ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0); (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
(dvoid *) username, (ub4) strlen((char *)username),
(ub4) OCI_ATTR_USERNAME, errhp); (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
(dvoid *) password, (ub4) strlen((char *)password),
(ub4) OCI_ATTR_PASSWORD, errhp); checkerr(errhp, OCISessionBegin ( svchp, errhp, authp, OCI_CRED_RDBMS,
(ub4) OCI_DEFAULT)); (void) OCIAttrSet((dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX,
(dvoid *) authp, (ub4) 0,
(ub4) OCI_ATTR_SESSION, errhp);
效率比较
odbc<pro*c<oci怀疑oracle公司某些工具就是使用oci开发的
空口无凭
如果你能不通过oracle的编程接口“直接操作”数据库的文件
那自然更快,你明白oracle的文件结构的话
OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. oci 虽然用起来好像很繁,但封装和代码管理起来都比pro*c好得多 ,目前已经有一些现成的封装类(如ociwrap),用起来比pro*c 还简单.9i 还提供了一个在oci 上的c++封装工具OCCI,使用ott 能把数据表直接转换为c++ 类,连访问代码都包含在其中了,感觉上挺方便的,不知道有那位用过的能谈一下经验.上面是摘的一断话:
原文
http://itpub.net/showthread.php?s=&threadid=64113
oci并不是直接操纵数据库的文件,
PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER.
OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER.
都需要sqlnet解析,
也就是说oracle只有一个接口SQLNET,
任何操作都是建立在SQLNET之上的
我既然把后面的
PRECOMPILER --> SQLLIB CALLS --->| UPI ---> SQLNET ---> SERVER.
OCI CALLS----------------------->| UPI ---> SQLNET ---> SERVER. 都交代出来了
还不至于犯这样的错误吧 :)