【发布时间】:2009-01-13 14:21:16
【问题描述】:
在几乎可以使用任何关系数据库的 C++ 应用程序中,生成可以轻松扩展以允许数据库引擎的怪癖的查询的最佳方法是什么?
换句话说,代码可能需要在各种数据库引擎之间以不一致的方式检索数据。在客户端设计代码以生成查询的最佳方式是什么,这将使支持新的数据库引擎成为一件相对轻松的事情。
例如,如果我的 (MFC) 代码如下所示:
CString query = "SELECT id FROM table"
results = dbConnection->Query(query);
我们决定支持一些使用“AVEC”而不是“FROM”的数据库。现在,只要用户使用该数据库引擎,此查询就会失败。
目前的选择:
- 最坏的选择:让进行查询的代码检查数据库类型。
- 更好的选择:在 db 连接对象上创建查询请求方法,该方法采用唯一的查询“代码”并根据正在使用的数据库引擎返回适当的查询。
- 更好的选择:创建一个查询构建器类,允许调用者在不直接使用任何 SQL 的情况下构建查询。查询完成后,调用者可以调用“生成”方法,该方法返回一个适合活动数据库引擎的查询字符串
- 最佳选择:??
注意:数据库引擎本身是通过我们自己创建的一些薄层抽象出来的。查询本身是唯一剩下的问题。
解决方案:
我决定使用“更好”选项(查询“选择器”)有两个原因。
- 调试:如下所述,使用选择器方法进行调试会稍微容易一些,因为查询是预先构建的,并在代码中以可读的形式列出。
- 灵活性:我突然想到,有些数据库可能有更好的和完全不同的解决特定查询的方法。例如,对于 Access,我每次都对多个表执行复杂的查询,因为我必须这样做,但在 Sql Server 上我想设置一个视图。从视图和几个表中选择是完全不同的查询(我认为),这个查询选择器可以轻松处理。
【问题讨论】: