gpt4 book ai didi

c++ - 以与数据库无关的方式查询构建

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:11 26 4
gpt4 key购买 nike

在几乎可以使用任何关系数据库的 C++ 应用程序中,生成可以轻松扩展以允许数据库引擎的怪癖的查询的最佳方法是什么?

换句话说,代码可能需要以各种数据库引擎之间不一致的方式检索数据。在客户端设计代码以生成查询的最佳方式是什么,从而使支持新数据库引擎成为一件相对轻松的事情。

例如,如果我有如下所示的 (MFC) 代码:

CString query = "SELECT id FROM table"
results = dbConnection->Query(query);

我们决定支持一些使用“AVEC”而不是“FROM”的数据库。现在,只要用户使用该数据库引擎,该查询就会失败。

到目前为止的选项:

  • 最糟糕的选择:让查询代码检查数据库类型。
  • 更好的选择:在采用唯一查询“代码”的数据库连接对象上创建查询请求方法,并根据所使用的数据库引擎返回适当的查询。
  • 更好的选择:创建一个查询构建器类,允许调用者在不直接使用任何 SQL 的情况下构建查询。查询完成后,调用者可以调用“生成”方法,该方法返回适合事件数据库引擎的查询字符串
  • 最佳选择:??

注意:数据库引擎本身是通过我们自己创建的一些薄层抽象出来的。查询本身是唯一剩下的问题。

解决方法:
我决定使用“更好”选项(查询“选择器”)有两个原因。

  1. 调试:如下所述,使用选择器方法调试会稍微容易一些,因为查询是预先构建的,并以代码中可读的形式列出。
  2. 灵 active :我突然想到,有些数据库可能有更好且完全不同的方法来解决特定查询。例如,使用 Access 我每次都对多个表执行复杂的查询,因为我必须这样做,但在 Sql Server 上我想设置一个 View 。从 View 中选择和从多个表中选择是完全不同的查询(我认为),这个查询选择器可以轻松处理。

最佳答案

您需要自己的查询编写对象,它可以由特定于数据库的实现继承。

所以你会做这样的事情:

DbAgnosticQueryObject query = new PostgresSQLQuery();
query.setFrom('foo');
query.setSelect('id');
// and so on
CString queryString = query.toString();

一旦您超越了从单个表中进行的简单选择,它就会变得非常复杂。已经有 ORM 包可以处理这些细微差别;查看它们而不是自己编写可能是值得的。

关于c++ - 以与数据库无关的方式查询构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/439097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com