免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2045 | 回复: 2
打印 上一主题 下一主题

[求教]如何封装Pro*c的多线程函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-08 09:51 |只看该作者 |倒序浏览
我想封装一个多线程proc函数,希望是封装好后调用者不需要再写sql_context来分配上下文运行环境就可以写出线程安全的访问Oracle的C程序。
举个简单的(去掉了select和fetch函数的)例子,最下面是我写的登录和登出数据库的程序,我想把
  1. EXEC SQL BEGIN DECLARE SECTION;
  2. sql_context ctx;
  3. EXEC SQL END  DECLARE SECTION;
  4. EXEC SQL ENABLE THREADS;
  5. EXEC SQL CONTEXT ALLOCATE :ctx;
复制代码
放到函数logon中,这样封装完后,别人再调用的时候就不需要考虑手动分配sql_context的问题了。
logon和logoff会同时执行很多遍,由于是在别的程序中调用,所以可以调用的时候给他们传递一个参数作为运行环境,但是我发现如果不在main中定义sql_context的话,logoff就拿不到我在logon中分配的运行环境,拜求proc达人给点指导,谢谢了。
  1. #include <sqlca.h>
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <stdlib.h>  
  5. #include <sqlda.h>  
  6. #include <sqlcpr.h>  
  7. #include <oci.h>
  8. void err_report();
  9. void logon();
  10. void logoff();

  11. /*****************************************************************
  12. * Function: logon
  13. *
  14. * Description: Logs on to the database as USERNAME/PASSWORD
  15. *
  16. *****************************************************************/
  17. void logon(ctx,connect_info)
  18. EXEC SQL BEGIN DECLARE SECTION;
  19. sql_context ctx;
  20. char * connect_info;
  21. EXEC SQL END  DECLARE SECTION;
  22. {
  23.     EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);
  24.     EXEC SQL CONTEXT USE :ctx;
  25.     EXEC SQL CONNECT :connect_info;
  26.     printf("Connected!\n");
  27. }


  28. /******************************************************************
  29. * Function: logoff
  30. *
  31. * Description: This routine logs off the database
  32. *
  33. ******************************************************************/
  34. void logoff(ctx)
  35. sql_context ctx;
  36. {
  37.     EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);
  38.     EXEC SQL CONTEXT USE :ctx;
  39.     EXEC SQL COMMIT WORK RELEASE;
  40.     printf("Logged off!\n");
  41. }

  42. /*****************************************************************
  43. * Function: err_report
  44. *
  45. * Description: This routine prints out the most recent error
  46. *
  47. ****************************************************************/
  48. void err_report(sqlca)
  49. //EXEC SQL BEGIN DECLARE SECTION;
  50. struct sqlca sqlca;
  51. //EXEC SQL END  DECLARE SECTION;
  52. {
  53.     if (sqlca.sqlcode < 0)
  54.         printf("\n%.*s\n\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
  55.         //printf ("wrong\n");
  56.     exit(1);
  57. }

  58. int main()   
  59. {
  60.     EXEC SQL BEGIN DECLARE SECTION;
  61.     sql_context ctx;
  62.     EXEC SQL END  DECLARE SECTION;
  63.     EXEC SQL ENABLE THREADS;
  64.     EXEC SQL CONTEXT ALLOCATE :ctx;

  65.     logon(ctx,"test/test@paysys1");
  66.     logoff(ctx);

  67. }
复制代码
我初步的想法有两个,
1、在main中定义一个sql_context的指针传递到logon中,然后在logon中使用sql_context初始化,可是却不知道怎么写,写出来的总是一运行就遇到问题需要关闭。
2、把logon定义成sql_context的,然后将sql_context作为返回值返回,可是也是不会写。

上面只是我的想法,但是由于自己不熟,周围也找不到对proc和C熟悉的人,一是不知道自己的想法对不对,另外也写不出实现的代码来,还望各位大侠帮帮忙,指点一下,谢谢各位了。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-11-08 12:06 |只看该作者
这个问题,建议楼主到C、C++版去问问。

论坛徽章:
0
3 [报告]
发表于 2010-11-08 14:15 |只看该作者
好的,谢谢斑竹。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP