动态调用中提示未打开数据库
我在AIX系统下主程序通过dlopen的方式动态调用子程序,主程序中打开了数据库,如果将dlopen所在的函数编译成动态库,子程序能正常运行。
如果将dlopen所在函数编译成静态库,子程序中访问数据库报未打开数据库。
不知道是编译参数少了还是其他什么原因,请指教。
程序如下:
main.ec
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
EXEC SQL include sqlca;
#ifndef SQLCODE
#define SQLCODE sqlca.sqlcode
#endif
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
char *dbname;
char s_rq;
EXEC SQLENDDECLARE SECTION;
dbname = getenv("DBNAME");
EXEC SQL DATABASE :dbname;
if( SQLCODE ) {
printf("[%s-%d] [%d]\n",__FILE__,__LINE__,SQLCODE);
exit (-1);
}
EXEC SQL SELECT rq INTO :s_rq FROM table1;
if( SQLCODE ) {
printf("[%s-%d] [%d]\n",__FILE__,__LINE__,SQLCODE);
exit (-1);
}
printf("In main rq:[%s]\n",s_rq);
dllcall("libmytest.so","getrq");
EXEC SQL CLOSE DATABASE;
exit (0);
}
getrq.ec
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL include sqlca;
int getrq()
{
EXEC SQL BEGIN DECLARE SECTION;
char s_rq;
EXEC SQLENDDECLARE SECTION;
bzero(s_rq,sizeof(s_rq));
EXEC SQL SELECT rq INTO :s_rq FROM table1;
if( SQLCODE ) {
printf("[%s-%d] [%d]\n",__FILE__,__LINE__,SQLCODE);
return -1;
}
printf("In getrq: RQ:[%s]\n",s_rq);
return 0;
}
dllcall.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
int dllcall( char *dllname, char *funname )
{
void *handle;
int (*func)();
int ret;
if( (handle=dlopen(dllname,RTLD_LAZY)) == NULL ) {
printf("打开动态库失败!\n");
return (-1);
}
if( (func = (int (*)())dlsym(handle,funname)) == NULL ) {
printf("打开函数失败!\n");
return (-1);
}
ret = func();
dlclose(handle);
return ret;
}
makefile
all: libmytest.so libdll_a.a libdll.so a b
libdll.so:dlldrv.o
cc -G -bexpall -bnoentry -o $@ dlldrv.o
libdll_a.a:dlldrv.o
ar -urv $@ dlldrv.o
libmytest.so:getrq.o
esql -G -bexpall -bnoentry -o $@ getrq.o
a:main.o
esql -O -o $@ main.o -L. -ldll_a
b:main.o
esql -brtl -O -o $@ main.o -L. -ldll
.SUFFIXES:.o .c .ec
.c.o:
cc -g -c $<
.ec.o:
esql -g -c $<
rm -f $*.c
clean:
rm -f a b *.so *.a *.o
编译后的执行程序
a是通过静态库调用的
执行结果:
In main rq:
[-349]
finderr 349
-349 Database not selected yet.
b是通过动态库调用的
执行结果:
In main rq:
In getrq: RQ:
哪位大侠指教下。谢谢! debug个,print一下连接数据库。。。。。 回复 1# happer_xc
线程中数据库的链接资源是共享的,进程就得重新链接了。 调用静态库就是起新的进程了吗? 感觉不是这样的 回复 4# happer_xc
不是库的问题,是dlopen的原因吧?静态库在编译的时候已经收集到执行程序里了。你试试把dlopen直接写到main里,我估计也一样。 回复 5# 3sane
是的,编在main函数里也是一样。 建议用connect/disconnent代替database/close database
页:
[1]