首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么用C语言实现数据库反射

2012-03-21 
如何用C语言实现数据库反射?工程需要使用到两种数据库:MySQL和SQLITE。我首先将常用的SQLITE的C语言API封装

如何用C语言实现数据库反射?
工程需要使用到两种数据库:MySQL和SQLITE。
我首先将常用的SQLITE的C语言API封装了一下,统一为MySQL的C语言API形式。
然后再使用宏替换具体的函数调用,例如:

C/C++ code
#ifdef DATABASE_MYSQL#define DB_QUERY mysql_query    //mysql_query()函数#elif defined DATABASE_SQLITE#define DB_QUERY sqlite_query   //sqlite_query()函数,与mysql_query()的参数列表是一致的#endif

最后在程序里面使用数据库API时,只需调用DB_QUERY()。由宏来决定具体用到的是mysql_query()还是sqlite_query()。

而这样的程序在预处理期即必须知道要使用的是MySQL还是SQLITE数据库。
请问大家,能否在运行期通过读配置文件的方式选择使用哪种数据库及其C语言API?如能,如何实现呢?

[解决办法]
1。如果编译时期都编译,用函数指针数组实现,这个简单,快,但不能满足动态需求。

2。如果编译时期不需要,运行时才需要,使用模块的思想,把这些封装在一个dll中,读配置时loadlibrary()进行注册,形成注册链,运行时调用。

例如 所有请求定义公共原型: 
typedef struct
{
int (*DB_OPEN)();
int (*DB_QUERY)(arg,arg2,..);
....
}plugin;

动态库初始化时new plugin(),并填好这些指针,然后把这个plugin加入到某个全局容器中。
调用部分轮询这个容器,根据返回值判断其是否已经处理,是否需要继续下发到下一个plugin,你这个数据库不需要如此复杂,只可能同时一个库,容器直接变成全局指针就行。


[解决办法]
我觉得楼主把这个问题想得有点复杂了。

用最简单的多态就可以做到。因为不管怎么说,在运行时,可以告知封装函数db_query某种对象,db_query可以根据这个传递过来的对象,判断是要调用mysql_query还是sqlite_query就可以了。

另外楼主也可以考虑使用adapter模式来实现。

热点排行