【问题标题】:Design Pattern for Creating Sql Queries创建 Sql 查询的设计模式
【发布时间】:2012-02-28 22:24:18
【问题描述】:

在我的公司中,几乎每个项目都有搜索面板和自定义过滤器。项目过滤器过多,创建困难。

有没有什么好的设计模式来创建自定义 sql 查询以使用过滤器?

我总是这样写:

commandText = "SELECT * FROM XXX "

innerJoinCommand = ""
whereCommand = ""

if (??.length > 0)
  whereCommand += "AND ??? "

if (??.Count > 0)
  innerJoinCommand += "??? "

//...

if (innerJoinCommand.length > 0)
  commandText += innerJoinCommand

if (whereCommand.length > 0)
  commandText += "WHERE " + whereCommand

【问题讨论】:

  • “设计模式”?你继续使用这个词。我不认为这意味着你认为它意味着什么。 :D 对不起,不得不。
  • 那么你更喜欢什么而不是“设计模式”?
  • 我在开玩笑。在面向对象的世界中,术语“设计模式”已经演变成某种东西,有点讽刺的是,它适合编码原型的一个子集。大模式并没有真正涵盖数据库交互,这就是我这么说的原因。
  • 设计模式并不局限于面向对象的世界。任何域都可以拥有它。

标签: sql tsql design-patterns database-design


【解决方案1】:

这种事情经常通过使用Builder Pattern来完成。

如果您想支持非常复杂的查询,它可能是一个相当复杂的构建器,其他模式可能会发挥作用,但这是我要开始的地方。

【讨论】:

【解决方案2】:

我使用了以下设计:

Is it a oop good design?

小技巧是放置“WHERE 1 = 1”,这样您就不必处理 ti 是 AND 还是必须添加的 WHERE。

【讨论】:

  • 小,但非常有用的技巧。感谢您指出这一点。
【解决方案3】:

这就是我的做法: (srp是一个包含所有可能参数的对象)

   string query = "select * from TABLE";

        if (srp != null)
        {
            query += " Where ";
            bool firstParameter = true;

            if (srp.ID!= 0)
            {
                if (!firstParameter)
                {
                    query += " and ";
                }
                query += " ID= " + srp.ID.ToString();
                firstParameter = false;
            }
        }

然后您可以根据需要复制内部。

当然,这只适用于AND参数,仍然不必创建更复杂的逻辑来使用或

【讨论】:

  • 感谢您的回答,但我认为这也令人困惑且难以实施......它应该比我想象的要容易:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
相关资源
最近更新 更多