以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- Linux应用开发 (http://sun4.cn/bbs/list.asp?boardid=32) ---- Oracle应用Linux开发C (http://sun4.cn/bbs/dispbbs.asp?boardid=32&id=1673) |
-- 作者:wangxinxin -- 发布时间:2010-11-23 11:05:05 -- Oracle应用Linux开发C 随着Linux操作系统的不断完善与发展,出现了大量基于 Linux平台的应用开发,原有的基于UNIX平台的商业软件也不断被移植到Linux上来。最典型的,Oracle公司宣布,他的现有的及未来所有的数据库产品和商业应用都将支持Linux平台。本文所述OCI for Linux的C语言库,正是Linux平台上Oracle的C语言接口。 我们知道,在一个复杂的Oracle数据库应用中,C程序代码由于其语言本身的灵活性、高效性,往往被加入到其商务逻辑的核心层模块中。Oracle数据库对C语言的接口就是OCI, Oracle 8.05int sqlo_init(int threaded_mode) 初始化程序库接口,读出环境变量,设置相应的全局变量。当前,threaded_mode设为0。 2)int sqlo_connect(int * dbh, char * connect_str) 连接数据库,dbh为数据库连接描述符,connect_str为用户名/口令字符串。 3)int sqlo_finish(int dbh) 断开数据库连接。 4)int sqlo_open(int dbh, char * stmt, int argc, char *argv[]) 打开由stmt确定的查询语句所返回的游标。Argc,argv为查询的参数,后面我们将用更清晰的方法传递参数。 5)int sqlo_close(int sth) 关闭由上一个函数打开的游标。 6)int sqlo_fetch(int sth) 从打开的游标中获取一条记录,并将之存入一个已分配内存空间中。 7)const char **sqlo_values(int sth, int *numbalues, int dostrip) 从内存中返回上一次sqlo_fetch取得的值,是以字符串形式返回的。 8)以下介绍另一种检索方式,int sqlo_prepare(int dbh, char const *stmt),返回一个打开的游标sth。 9)int sqlo_bind_by_name(int sth, const char * param_name, int param_type, const void * param_addr, unsigned int param_size, short * ind_arr, int is_array) 将查询语句的传入参数,按照名字的形式与函数中的变量绑定。如果你使用数组,那么参数param_addr和ind_arr必须指向该数组。 int sqlo_bind_by_pos(int sth, int param_pos, int param_type, const void * param_addr, unsigned int param_size, short * ind_arr, int is_array) 将查询语句的传出值,按照位置顺序与函数中的变量绑定。 10)int sqlo_execute(int sth, int iterations) 执行查询语句。“Iterations”可设为“1”。 11)在执行完数据库操作后,我们可用int sqlo_commit (int dbh)提交操作,或用int sqlo_rollback(int dbh)回滚操作。 12)Libsqlora8还有其他一些操作函数,这里就不一一列出了。 下面举几个例子说明这些函数如何使用。 cstr = "ocitest/ocitest"; //用户名/口令 status = sqlo_init(0); if (SQLO_SUCCESS != status) { printf ("sql_init failed. Exitingn"); exit(1); } status = sqlo_connect(&dbh, cstr); // int dbh 以上源代码,显示了如何连接数据库。 /* Select all and display */ char *select_stmt="SELECT cname, clength, colid FROM ocicolu"; if (0>(sd = sqlo_open(dbh, select_stmt, 0, NULL))) { printf("sqlo_open failed: %sn", sqlo_geterror(dbh)); return 0; } while (0 == sqlo_fetch(sd,1)) { v = sqlo_values(sd, NULL, 1); printf("Result: %sn",v); } if (0 > sqlo_close(sd)) { printf("sqlo_open failed: %sn", sqlo_geterror(dbh)); return 0; } 以上例子展示了第一种查询方法,显然,这种方法较简单,但不够灵活。 char *update_stmt = "UPDATE ocitest.upload_log SET upload_fresh = where log_name = :1"; if (0 <= (sth = sqlo_prepare(dbh, update_stmt))) { if (SQLO_SUCCESS != (sqlo_bind_by_name(sth, ":1", SQLOT_STR, packet_name, 64, NULL, 0) )) { printf("sqlo_bind_param failed failed: %sn", sqlo_geterror(dbh) ); return 0; } } if (SQLO_SUCCESS != sqlo_execute(sth, 1)) { printf("sqlo_execute failed: %sn", sqlo_geterror(dbh) ); return 0; } 上面的代码显示了如何通过名字绑定变量,“:1”在Oracle SQL语句中表示为一个变量(名字随意),在sqlo_bind_by_name函数中与packet_name变量绑定。在变量绑定完毕后,就可以调用sqlo_execute函数来执行这个SQL语句。 好了,我们已经向大家介绍了Libsqlora8的基本使用方法,如果希望了解更多内容,Libsqlora8的程序包中带有详细的说明和例子,大家不妨自己钻研一下。有什么心得,欢迎和我联系。E-mail:nick_chen@yeah.net /*------------------------------------------------------------------------- * testlora.c * Test programm for libsqlora8(Kai Poitschke) * Assuming you installed the library with prefix=/usr/local, the command * to compile this is: * gcc -o sample sample.c -lsqlora8 -L$ORACLE_HOME/lib -lclntsh *-----------------------------------------------------------------------*/ #include #include #include * create our test table *-----------------------------------------------------------------------*/ int create_table( int dbh ) { int nkey; char ckey; double nv |