免费注册 查看新帖 |

Chinaunix

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

问:在unix上编程,如何屏蔽数据库间的差异 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-29 16:01 |只看该作者 |倒序浏览
如何屏蔽数据库间的差异

unixODBC没用过,不知道怎么样

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-11-29 17:16 |只看该作者
推荐你用otl。

论坛徽章:
0
3 [报告]
发表于 2006-11-29 19:22 |只看该作者
原帖由 ningth 于 2006-11-29 16:01 发表
如何屏蔽数据库间的差异

unixODBC没用过,不知道怎么样



如果不想自己封装,unixodbc应该是个不错的选择。
以前做过类似的工作,连接里有个文档你可参考。 http://www.onlyit.cn/bbs/doc/over_db.rar
不过那个是很早的版本了。现在在用的版本做了些改进,多了对多线程和连接池的支持。贴上和连接打交道的头文件供参考。


  1. #ifndef itf_db_h
  2. #define itf_db_h

  3. #include <system.h>
  4. #include <dbdatamgr.h>
  5. #include <dbdatamgr_itf.h>
  6. #include <memlist.h>
  7. #include <stdio.h>
  8. #include <thread_ext.h>

  9. //这个是后台数据库,决定了sql语句的适用性
  10. #define  Db_Serv_Undef             0
  11. #define  Db_Serv_Oracle            1
  12. #define  Db_Serv_Access            2
  13. #define  Db_Serv_Sybase            3
  14. #define  Db_Serv_Mysql             4
  15. #define  Db_Serv_Informix          5
  16. #define  Db_Serv_Odb               6

  17. //这个是客户端连接用的,不用于决定sql语句
  18. #define  Db_Type_Oracle            1      //oracle
  19. #define  Db_Type_Bde               2      //bde
  20. #define  Db_Type_Exp_Oracle        3      //exp_oracle
  21. #define  Db_Type_Exp_Mssql         4      //exp_mssql
  22. #define  Db_Type_Vc                5      //vc_odbc
  23. #define  Db_Type_Ado_Access        6      //ado_access
  24. #define  Db_Type_Itf_Sql           7      //itf_sql
  25. #define  Db_Type_Mysql             8      //itf_mysql

  26. #define  Db_Type_Odb_V01           10     //odb

  27. class TDb_Connect
  28. {
  29. protected:
  30.   int  mServ_Type;

  31. public:
  32.   int  mDb_Type;
  33.   char mDb_Name[60];
  34.   char mUser_Name[60];
  35.   char mPassword[60];
  36.   char mGrp_Name[60];
  37.   char mHost[60];
  38.   int  mPort;
  39.   int  mInitlized;
  40.   int  mTid;
  41.   int  mCreate_Tid;
  42.   void  * mAss_Ptr;
  43.         void (* mRelease_Obj_Handle)(void * conn);
  44.   DBDataMgr_Itf_Stru mData_Oper_Funcs;

  45. protected:
  46.   int  (* _Set_Data_Oper_Handle)(DBDataMgr_Itf_Stru * oper_ptr);
  47.   int  (* _Connect_Handle)(void * ddm,int db_type,char * db_name,char * user_name,
  48.                       char * password,char * host,int port);
  49.   int  (* _Disconnect_Handle)(void * ddm);
  50.   int  (* _Commit_Handle)(void * ddm);
  51.   int  (* _Rollback_Handle)(void * ddm);
  52.   int  (* _ExecuteSql_Handle)(void * ddm,char * sqlcmd);
  53.   int  (* _ExecuteProc_Handle)(void * ddm,char * sqlcmd);
  54.   int  (* _SelectRow_Handle)(void * ddm,char * sqlcmd,int (* data_handle)(void *,void *),
  55.                       void * dbioptr,void * assptr);
  56.   int  (* _BatchInsert_Handle)(void * ddm);

  57. public:
  58.   TDb_Connect();
  59.   ~TDb_Connect();

  60.   virtual int Set_Serv_Type(int db_serv_type);
  61.   virtual int Get_Serv_Type();

  62.           int SetLocalTid();
  63.   virtual int Load_Handle(char * lib_file);

  64.   virtual int Connect(int db_type,char * db_name, char * user_name,char * password,
  65.                       char * host=NULL,int port=0);
  66.   virtual int Disconnect();
  67.   virtual int Commit(DBDataMgr * ddm);
  68.   virtual int Rollback(DBDataMgr * ddm);
  69.   virtual int ExecuteSql(DBDataMgr * ddm,char * sqlcmd);
  70.   virtual int ExecuteProc(DBDataMgr * ddm,char * sqlcmd);
  71.   virtual int SelectRow(DBDataMgr * ddm,char * sqlcmd,int (* data_handle)(void *,void *),
  72.                       void * dbioptr,void * assptr);
  73.   virtual int BatchInsert(DBDataMgr * ddm);
  74.   virtual int Get_Sequence_Id(DBDataMgr * ddm,char * seq_name,int * seq_val);
  75.   virtual int Get_Sequence_Cur_Val(DBDataMgr * ddm,char * seq_name,int * seq_val);
  76.   virtual int Set_Sequence_Id(DBDataMgr * ddm,char * seq_name,int seq_val);
  77. };

  78. class TDb_Connect_Mgr
  79. {
  80. public:
  81.   TMemList mConn_Lst;
  82.   TThread_Lock * mLock;

  83. protected:
  84.   int Check_Lock();

  85. public:
  86.   TDb_Connect_Mgr();
  87.   ~TDb_Connect_Mgr();

  88.   int Add_Connect(TDb_Connect * conn);
  89.   int Remove_Connect(TDb_Connect * conn);
  90.   int End_Session(char * grp_name=NULL);
  91.   int Get_Free_Count(char * grp_name=NULL);
  92.   int Get_Count(char * grp_name=NULL);
  93.   TDb_Connect * Get_Session(char * grp_name=NULL);
  94.   int Disconnect(char * grp_name=NULL);             //关闭一个数据库连接
  95.   int Disconnect(TDb_Connect * conn);               //关闭一个数据库连接
  96.   int Disconnect_Self_Thread();                     //关闭本线程创建的数据库连接
  97. };

  98. //建立数据库连接

  99. //无需指定后台
  100. extern int Mts_Ora(char * dbname,
  101.                    char * username,
  102.                    char * passwd,
  103.                    int connnum=1,
  104.                    char * grp_name=NULL);

  105. //最后一个参数指定后台
  106. extern int Mts_Bde(char * dbname,
  107.                    char * username,
  108.                    char * passwd,
  109.                    int connnum=1,
  110.                    char * grp_name=NULL,
  111.                    int db_serv_type=0);

  112. //无需指定后台
  113. extern int Mts_Exp_Oracle(char * dbname,
  114.                    char * username,
  115.                    char * passwd,
  116.                    int connnum=1,
  117.                    char * grp_name=NULL);

  118. //无需指定后台
  119. extern int Mts_Exp_Mssql(char * hostname,
  120.                    char * dbname,
  121.                    char * username,
  122.                    char * passwd,
  123.                    int connnum=1,
  124.                    char * grp_name=NULL);

  125. //无需指定后台
  126. extern int Mts_Odb(char * dbname,
  127.                    char * username,
  128.                    char * passwd,
  129.                    int connnum,
  130.                    char * grpname,
  131.                    char * host,
  132.                    int port);

  133. //无需指定后台
  134. extern int Mts_Ado_Access(
  135.                    char * dbname,
  136.                    char * username,
  137.                    char * passwd,
  138.                    int connnum=1,
  139.                    char * grp_name=NULL);

  140. //无需指定后台
  141. extern int Mts_Mysql(char * dbname,
  142.                    char * username,
  143.                    char * passwd,
  144.                    char * host=NULL,
  145.                    int port=0,
  146.                    int connnum=1,
  147.                    char * grpname=NULL);


  148. //最后一个参数指定后台
  149. extern int Mts_Vc(char * dbname,
  150.                    char * username,
  151.                    char * passwd,
  152.                    int connnum=1,
  153.                    char * grp_name=NULL,
  154.                    int db_serv_type=0);


  155. extern int Mts_Get_Free_Count(char * grp_name=NULL);         //获得未被占用的连接数量
  156. extern int Mts_Get_Count(char * grp_name=NULL);              //获得连接数量

  157. extern TDb_Connect * Mts_Get_Session(char * grp_name=NULL);  //获得一个未被占用的连接,或者是本线程正在使用的连接
  158. extern int Mts_End_Session(char * grp_name=NULL);            //释放一个数据库会话

  159. extern int Mts_Disconnect(char * grp_name=NULL);             //关闭一个数据库连接
  160. extern int Mts_Disconnect(TDb_Connect * conn);                                                         //关闭一个数据库连接
  161. extern int Mts_Disconnect_Self_Thread();

  162. extern TDb_Connect * New_Bde_Connect();
  163. extern TDb_Connect * New_Ora_Connect();
  164. extern TDb_Connect * New_Net_Connect();
  165. extern TDb_Connect * New_Odb_Connect();
  166. extern TDb_Connect * New_Exp_Connect();
  167. extern TDb_Connect * New_Mysql_Connect();

  168. //下面2个函数被各数据库驱动程序调用,应用程序不应该调用
  169. extern int Mts_Add_Connect(TDb_Connect * conn);
  170. extern int Mts_Remove_Connect(TDb_Connect * conn);

  171. extern TDb_Connect_Mgr * Db_Connect_Mgr;

  172. extern int    Global_Init_Db_Connect_Mgr();
  173. extern int    Init_Db_Connect_Mgr();
  174. extern void * Mts_Get_Mgr_Ptr();
  175. extern int    Mts_Set_Mgr_Ptr(void * ptr);

  176. #endif

复制代码

论坛徽章:
0
4 [报告]
发表于 2006-11-29 20:12 |只看该作者
odbc很多情况下出问题都查不出原因, 不能自己+数据库软件提供上完全来控制。
有时候稍微麻烦点是必要的,数据库访问相关的拉出接口来就行了, 不同的数据库搞个不同实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP