如何做一个通用的数据库访问接口,不同种类数据库可以分别实现?

phisher 2009-11-04 07:59:28
我现在在编写一个程序,在程序中需要使用数据库。现阶段使用的是mysql数据库,mysql有自身的优点。但是将来可能由于性能上的原因换成其他的数据库,比如Oracle数据库,或者其他什么数据库。

为了使程序不依赖于具体的数据库实现,我想写一个“通用的数据库访问接口”。这个接口完全是事务性的。这个接口的一些方法是比较容易确定的,比如插入一条用结构体XXX表示的数据:insertXXXData(XXX& x);

但是如果是查询,特别是有很多条件组合的查询的时候,就不知道该怎么写了。听说了两个方法:

1. 有人说是直接传入SQL,写成GetXXXData(CString& strSQL, Vector<XXX>& vecX);但是这个SQL语句会不会由于数据库的不同而有所改变呢?而且直接把SQL写在接口中,上层用起来会比较麻烦。

2. 在接口当中用用自己定义的一些类型来表示条件,再用一些操作符来将这些条件连接起来。这个方法我都没有想清楚,也许根本就不现实。

大家有什么好方法来写这个“通用的数据库访问接口”呢?
...全文
1449 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
smilechina1988 2010-03-18
  • 打赏
  • 举报
回复
长见识了,看来我还需多加努力
phisherr 2009-11-11
  • 打赏
  • 举报
回复
不错,我替楼主谢谢大家的热情讨论!
maple_zhj 2009-11-09
  • 打赏
  • 举报
回复
实现一个接口,

然后在下面 分别写 各自的处理方法啊,

毕竟,每个数据库 的 SQL还是有点差别的。

ADO已经够简单的了。
康斯坦汀 2009-11-06
  • 打赏
  • 举报
回复
不必这样麻烦,可以这样做。

首先,程序分层设计,将所有操作数据库的代码封装在“数据访问层”
然后,SQL 本身有标准,例如:SQL-92 SQL3 等。
在“数据访问层”只写符合SQL标准的语句,比如基本的 select ,insert, update ,delete等等。

对于需要特定于某种数据库的语句,有两种方式。

方式一:全部做成“存储过程”在服务器端运行,客户端只传递命令和参数,具体的特定代码
在数据库里,针对不同的数据库编写成脚本,在安装数据库中执行。

方式二:将特定代码编写在前台,定义统一的接口,然后针对不同的数据库实现(如同COM)

建议采用方式一。是简单和规矩的做法。
jameshooo 2009-11-06
  • 打赏
  • 举报
回复
ADO不是已经做了这样的事了吗?
使用者使用一套统一的模型,提供者也是一套统一的模型,每种数据库都提供自己的提供者实现,底层的区别使用者是看不到的。
ADO的使用已经足够简单了,不知道楼主还要封装些什么东西。
muzizongheng 2009-11-06
  • 打赏
  • 举报
回复
在codeproject里搜 CSQLServer类, 很牛. 呵呵.
Dingnifei123 2009-11-05
  • 打赏
  • 举报
回复
不好意思,

是因地制宜,
caitian6 2009-11-04
  • 打赏
  • 举报
回复
哈哈,我找到了,是OTL
网址在这,http://otl.sourceforge.net/
caitian6 2009-11-04
  • 打赏
  • 举报
回复
明天到公司,告诉你名字
caitian6 2009-11-04
  • 打赏
  • 举报
回复
有的,有个这样的库, 还可以跨平台
是用的ODBC的技术 , 在LINUX下装个ODBC 的驱动,也能访问各种数据库
问题是名字我忘啦,哈哈
feilinhe 2009-11-04
  • 打赏
  • 举报
回复
呵呵,网上有封装好的ADO数据库类,不过LZ的要求好像高点“插入一条用结构体XXX表示的数据”,直接插入结构体,我还没见过这样的封装,都是按数据一个个插入的,LZ还是到数据库板块问问吧,那有专业的高手啊
kangde 2009-11-04
  • 打赏
  • 举报
回复
至少有自己的
表, 列, 行集等基本数据库元素的类型定义
之后约定一下数据提供者用于填充这些类型的规范,
按照规范分别编写响应数据库的提供者.
phisherr 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xumaojun 的回复:]
自己封装一个用ADO方式访问数据库的类,然后再根据不同的数据库传入不同的连接字符串就可以实现对各种数据库的访问。其实操作各种数据库的sql语句都是一样的,就是刚开始打开数据库的连接字符串不一样。当然不同的数据库添加数据源的方式不一样。
[/Quote]

其实现在也是那么干的,用ADO封了一次。就是担心SQL语句会有略微的不相同
ziplj 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xumaojun 的回复:]
自己封装一个用ADO方式访问数据库的类,然后再根据不同的数据库传入不同的连接字符串就可以实现对各种数据库的访问。其实操作各种数据库的sql语句都是一样的,就是刚开始打开数据库的连接字符串不一样。当然不同的数据库添加数据源的方式不一样。
[/Quote]高见...学习了 看来OO的思想还没理解透...
xumaojun 2009-11-04
  • 打赏
  • 举报
回复
自己封装一个用ADO方式访问数据库的类,然后再根据不同的数据库传入不同的连接字符串就可以实现对各种数据库的访问。其实操作各种数据库的sql语句都是一样的,就是刚开始打开数据库的连接字符串不一样。当然不同的数据库添加数据源的方式不一样。
ziplj 2009-11-04
  • 打赏
  • 举报
回复
...五个裤衩的马甲 你够牛
这个东西只要设计的时候考虑到了 就我个人认为 将SQL语句的执行过程交给一个固定的函数处理 比较好 就像楼主的第一个方法 不才只能想到这个地方 后面的就等高手来了
phisherr 2009-11-04
  • 打赏
  • 举报
回复
高手在哪里,马甲来顶
ziplj 2009-11-04
  • 打赏
  • 举报
回复
比较难...
等高手 我们公司现在也是这个问题

4,017

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧