加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C:数据库的通用接口设计

发布时间:2020-12-16 07:11:43 所属栏目:百科 来源:网络整理
导读:我有一个用于创建与数据库连接的类: class DBHandler{public: DBHandler(); ~DBHandler(); int connect(); int execQuery( string query); string getField( int row,int col);}; 现在有另一个类用于从数据库中获取一些信息, class DBManager{public: DBMan
我有一个用于创建与数据库连接的类:

class DBHandler
{
public:
    DBHandler();
   ~DBHandler();

    int connect();
    int execQuery( string query);
    string getField( int row,int col);
};

现在有另一个类用于从数据库中获取一些信息,

class DBManager
{
public:
    DBManager();
   ~DBManager();

   //Approach 1
   string getUsername()
   {
      //create a query here and use     object of DBHandler class to execute it.
   }

   //Approach 2
   string getUsername (struct     QueryDetails& qDetails)
   {
      //create query using fields of structure and execute the query using DBHandler class.
   }
 };

现在问题是:

1)我应遵循哪种方法:

> A)如果我使用方法1,那么我需要硬编码查询.
> B)如果我使用方法2,那么每次调用函数getUsername之前我都需要填充结构.

2)除了这两个通用之外,还有更好的解决方案吗?

PS:结构的定义

struct QueryDetails
{
    string tableName;
    vector<string> colList;
 ...
};

解决方法

您的问题非常广泛,您提供的要素不允许向您提出客观的最佳答案.

您的方法1具有以下优点:

>这是一种强大而安全的方法:查询是在了解相关对象的情况下编写的
>如果数据库发展,很容易找到(文本搜索)对表进行特定查询,并更新对象的查询代码
>如果您的对象不断发展,不用说,您将立即意识到您必须在数据库端进行更改

主要的不便之处在于,您与数据库紧密相连.如果明天您从PostGres更改为其他内容,则必须重写每个查询.

您的方法2具有以下优点:

>非常灵活
>如果数据库发生更改,则必须仅更改通用函数.

不便之处在于,这种灵活性会给维护带来很多风险:您无法确定客户端是否发送了正确的查询,并且很难评估数据库布局更改的影响评估.

最后,由您决定哪一个更适合您的需求.

我个人倾向于支持1.但这是主观的,我还是会引入一个额外的层来使应用程序代码更加独立于实现数据库访问的数据库系统.

但是,根据您的需要,更大的灵活性可能是有利的.例如,如果您的类实际上是其他calsses获取自己的数据的中间层,那么方法2可能是最佳选择.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读