本示例程式基於對oci庫方法的簡單的封裝,若要實驗本程式,要求有linux下的oci庫libclntsh.a或libclntsh.so。
下面是對其簡單的封裝:
#include
#include "oratypes.h"
#include "ocidfn.h"
#ifdef __stdc__
#include "ociapr.h"
#else
#include "ocikpr.h"
#endif
#include "ocidem.h"
#define oci_exit_failure 1
#define oci_exit_success 0
#define defer_parse
1#define native
1#define version_7
2void logon(lda_def *lda,ub1 *hda,text *user,text* passwd);
void logon1(lda_def *lda,ub1 *hda,text *user,text* passwd);
void logoff (lda_def *lda,cda_def *cda_cur);
void opencurs(cda_def *cda_cur,lda_def *lda_cur);
void parsesql(cda_def *cda_cur,text *sqlstmt,lda_def *lda);
void defineintout(cda_def *cda,lda_def *lda,int *out,sword index);
void definetextout(cda_def *cda,lda_def *lda,text *out,sword index,sword size);
void err_report(cda_def *cursor,lda_def *lda);
void do_exit(eword status);
void close_cursor(cda_def *cda_cur);
void execute_sql(cda_def *cda_cur,lda_def *lda);
void bind_sql(cda_def *cda,text *txt,ub1 *ub,int size,int sql_type,lda_def *lda);
///ocihelper.h實現部分ocihelper.cpp //
#include
#include
#include "ocihelper.h"
void logon(lda_def *lda,ub1 *hda,text *user,text* passwd)
printf("\n connected to oracle as %s\n",user); }
void logon1(lda_def *lda,ub1 *hda,text *user,text* passwd)
printf("\n connected to oracle as %s\n",user); }
void opencurs(cda_def *cda_cur,lda_def *lda_cur)}
void parsesql(cda_def *cda_cur,text *sqlstmt,lda_def *lda) }
void logoff(lda_def *lda,cda_def *cda_cur)
if (ologof(lda))
}void close_cursor(cda_def *cda_cur)}
void execute_sql(cda_def *cda_cur,lda_def *lda)}
void do_exit(eword status)
void err_report(cda_def *cursor,lda_def *lda)
void defineintout(cda_def *cda,lda_def *lda,int *out,sword index)}
void definetextout(cda_def *cda,lda_def *lda,text *out,sword index,sword size)}
void bind_sql(cda_def *cda,text *txt,ub1 *ub,int size,int sql_type,lda_def *lda)}
然後將其打包為庫:在此以兩種方法庫的形式給出,使用方法一樣:都指出庫路徑所在目錄或放在預設目錄下即可
打包為動態鏈結庫:
g++ -o libocihelper.so -shared -rdynamic -fpic -libclntsh.a
打包為靜態鏈結庫:
g++ -c ocihelper.cpp
ar -rc libocihelper.aocihelper.o libclntsh.a
下面是使用示例,首先定義全域性變數,幷包含標頭檔案ocihelper.h
lda_def lda;
ub1 hda[hda_size/(sizeof(ub1))];
cda_def cda;
1. select序列的值
sword cert_id;
logon( &lda, (ub1*)hda,(text *)"orausr",(text *)"ora123");
opencurs(&cda,&lda);
parsesql(&cda,(text *)"select cert_sequence.nextval from dual",&lda);
defineintout(&cda,&lda,&cert_id, (sword)1);
execute_sql(&cda,&lda);
if(ofetch(&cda) == 0)
close_cursor(&cda);
2.insert錶值
text *insertstmt=(text *)"insert into certlist values(:certid,:userinfo,:inputtime);
char local_time[12];
time_t t;//獲取當前日期
t=time(null);
struct tm *currtime;
currtime=(struct tm*)localtime(&t);
memset(local_time,0,sizeof(local_time));
sprintf((char*)local_time,"%04d-%02d-%02d",1900+currtime->tm_year,1+currtime->tm_mon,currtime->tm_mday);
logon(&lda,(ub1 *)hda,(text *)"orausr",(text *)"ora123");
opencurs(&cda,& lda);
parsesql(&cda,insertstmt,&lda);
bind_sql(&cda,(text *)":certid",(ub1 *)&cert_id,sizeof(cert_id),sqlt_int,&lda);
bind_sql(&cda,(text *)":userinfo",(ub1 *)user_info,strlen(user_info)+1,sqlt_str,&lda);
bind_sql(&cda,(text *)":inputtime",(ub1 *)local_time,strlen(local_time)+1,sqlt_str,&lda);
execute_sql(&cda, &lda);
close_cursor(&cda);
ologof(&lda);
3.update錶值
text *updatequerystmt=(text*)"update certlist set inputtime=:time where id=:certid";
logon(&lda,(ub1 *)hda,(text *)"orausr",(text *)"ora123");
opencurs(&cda,&lda);
parsesql(&cda,updatequerystmt,&lda);
bind_sql(&cda,(text *)":certid",(ub1 *)&cert_id,sizeof(cert_id),sqlt_int,&lda);
bind_sql(&cda,(text *)":time",(ub1 *)local_time,sizeof(local_time),sqlt_str,&lda);
execute_sql(&cda, &lda);
close_cursor(&cda);
4.獲取滿足sql條件的記錄條數
void getdatabasecount(text *sqlstmt,sword *count)
*count=count;
if (cda.rc!= no_data_found)
err_report(&cda,&lda);
close_cursor(&cda);}
Linux下的簡單socket程式設計示例
api中用到的結構體 1.struct sockaddrstruct sockaddr sockaddr包含兩部分內容 1.短整型sa family定義了位址家族型別,這個型別會用於socket 函式2.14位元組的sa data陣列預留儲存本身的位址注意 1.原本沒有sa len2.根據sa fa...
linux執行緒程式設計示例
執行緒程式設計和rtos實時任務建立差不多,比程序更節省資源 執行緒標頭檔案 include 函式原型 1.建立執行緒 int pthread create pthread t thread,const pthread attr t attr,void start routine void void...
Linux下程式設計
windows下我的環境為 windows10 vs2015 opencv3.4.0 opencv3.4.0 contrib python linux下我的環境為 ubuntu16004 也有ubuntu1804 opencv3.4.0 opencv3.4.0 contrib python gnu ...