///
在main中进行context的初始化
//
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include <sqlda.h>
#include <process.h>
typedef unsigned (WINAPI * PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter);
typedef unsigned * PBEGINTHREADEX_THREADID;
EXEC SQL BEGIN DECLARE SECTION;
#define THREADS 2
struct parameters
{
sql_context *ctx;
int thread_id;
};
typedef struct parameters parameters;
char username[20],password[20],server[20];
EXEC SQL END DECLARE SECTION;
void sql_error(struct sqlca);
void logon(sql_context);
void logoff(sql_context);
void query1(parameters *);
void query2(parameters *);
void main(int argc,char ** argv)
{
EXEC SQL BEGIN DECLARE SECTION;
sql_context ctx[THREADS];
EXEC SQL END DECLARE SECTION;
HANDLE thread[THREADS];
DWORD threadid[THREADS];
parameters params[THREADS];
int i;
char *connstr,*pos;
connstr=(char*) malloc(sizeof(char)*(strlen(argv[1])+1));
strcpy(connstr,argv[1]);
if (pos=strchr(connstr,'/'))
{
connstr[pos-connstr]='/0';
strcpy(username,connstr);
connstr=pos+1;
}
if (pos=strchr(connstr,'@'))
{
connstr[pos-connstr]='/0';
strcpy(password,connstr);
connstr=pos+1;
}
strcpy(server,connstr);
EXEC SQL ENABLE THREADS;
EXEC SQL WHENEVER SQLERROR DO sql_error(sqlca);
for(i=0;i<THREADS;i++)
{
printf("start thread %d /n",i+1);
EXEC SQL CONTEXT ALLOCATE :ctx[i];
logon(ctx[i]);
}
for(i=0;i<THREADS;i++)
{
params[i].ctx=ctx[i];
params[i].thread_id=i;
switch(i)
{
case 0:
thread[i]=(HANDLE) _beginthreadex(NULL,0,(PBEGINTHREADEX_THREADFUNC) query1,¶ms[i],0,(PBEGINTHREADEX_THREADID)&threadid[i]);
printf("%d thread start/n",i+1);
break;
case 1:
thread[i]=(HANDLE) _beginthreadex(NULL,0,(PBEGINTHREADEX_THREADFUNC) query2,¶ms[i],0,(PBEGINTHREADEX_THREADID)&threadid[i]);
printf("No.%d thread start/n",i+1);
break;
}
}
for(i=0;i<THREADS;i++)
{
DWORD dwRet = WaitForMultipleObjects(THREADS,thread,TRUE,INFINITE);
logoff(ctx[i]);
EXEC SQL CONTEXT FREE :ctx[i];
}
}
void query1(parameters *param)
{
struct sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
long art_no;
char descr[33];
EXEC SQL END DECLARE SECTION;
sql_context ctx;
ctx=param->ctx;
EXEC SQL WHENEVER SQLERROR DO sql_error(sqlca);
EXEC SQL CONTEXT USE :ctx;
EXEC SQL select art_no,descr into :art_no,:descr from article where art_no=10;
printf("%d%s/n",art_no,descr);
}
void query2(parameters *param)
{
struct sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
long art_no;
char descr[33];
EXEC SQL END DECLARE SECTION;
sql_context ctx;
ctx=param->ctx;
EXEC SQL WHENEVER SQLERROR DO sql_error(sqlca);
EXEC SQL CONTEXT USE :ctx;
EXEC SQL select art_no,descr into :art_no,:descr from article where art_no=24;
printf("%d%s/n",art_no,descr);
}
void sql_error(struct sqlca sqlca)
{
if(sqlca.sqlcode <0)
{
printf("error/n");
}
exit(1);
}
void logon(sql_context ctx)
{
EXEC SQL CONTEXT USE :ctx;
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
}
void logoff(sql_context ctx)
{
EXEC SQL CONTEXT USE :ctx;
EXEC SQL COMMIT WORK RELEASE;
}
//
编译
/
proc iname=D:/proc/ora_thread1/ora_thread1.pc oname=D:/proc/ora_thread1/ora_thread1.c parse=full include=D:/orant/precomp/public include="d:/Program Files/Microsoft Visual Studio/VC98/Include" threads=yes
转自:http://hi.baidu.com/zmjeffwc/blog/item/f4d0bd24ba5c943ac995590d.html