首页 新闻 会员 周边

关于三层架构的小问题----如何应对多变的查询

0
悬赏园豆:20 [已关闭问题]

三层:表现层;逻辑层;数据层;

有一需求:传入查询条件,得到数据。查询条件数目不定,通常的解决方法是在表现层拼凑SQL语句。如:

 

if(textEdit1.Text != "")
{
sql
+= "and name = '"+textEdit1.Text.Trim()+"'";
}

 

 

 

。这样感觉不太好,表现层里出现了SQL。那么有什么好的办法,可以将拼SQL或类似的工作放在数据层呢?谢谢。

会长的主页 会长 | 专家六级 | 园豆:12401
提问于:2010-05-11 23:47
< >
分享
其他回答(4)
0

即然选择了多层架构,但要做到最好,每一个拼写SQL语句的地方,都应该对应一个业务逻辑方法。所以前期做好需求很重要,先定义接口(能想到的所有逻辑),然后再实现接口中的方法(参数传递,避免SQL注入等)。

Astar | 园豆:40805 (高人七级) | 2010-05-12 08:36

如果能看看别人写的代码就好了,不知道有没有类似的开源代码

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2011-11-22 17:58
0

表现层

业务处理层

数据罗辑层

数据层

 

把你的拼SQL写到数据罗辑层

千羽 | 园豆:666 (小虾三级) | 2010-05-12 08:54
0

你可以把所有SQL都放在一个配置文件里,写一个从配置文件读取SQL的方法,格式类似

<SQL id="GetItem">
<![CDATA[select col_name_zh ZBName, db_field ZBKey
fromTFM_ALARM_COL_INFO_BJ
where entry_flag = {0}
order by zbname]]
>
</SQL>

至于参数entry_flag = {0}
就可以直接用string.Format()方法了,这样就算放在表现个层,sql也是封装好的

马克去去 | 园豆:15 (初学一级) | 2010-05-12 10:12

呵呵,这个办法以前的项目里也用过,感觉不错。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2011-11-22 17:57
0

我是这么进行设计的,并且遵循以下原则。

  1. 首先,我依旧必须保证整个项目的面向对象性。
  2. 我必须保证整个项目的分层性。
  3. 我必须保证“让类库的使用者方便,而不是实现者方便”的原则。

因此,如果不确定查询很复杂的话,我会在系统中设计以下的类。

GreaterThanOrEquals、Equals、LessThanOrEquals、And、Or、Group(用于 Where 语句中的括号情况)、Like 等等所有在 Where 语句中会用到的操作(或者一个子集)。

在后台,分析这些类,并且解析成 SQL 语句。

周巍 | 园豆:735 (小虾三级) | 2010-05-12 11:27

听起来不错,但愿有机会能够详细探讨下,或者楼主写篇博客吧

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2011-11-22 17:55
0

分层主要是为了体现逻辑独立性,即高内聚低耦合。不该出现在这个层的东西就不要让他出现。这样以后你换数据库,或者改前台就会很方便了。

不过我建议你不要用拼接字符串的方法。你可以将语句写入数据库,用的时候调用存储过程就好了。这样更安全,更方便。

耀哥 | 园豆:205 (菜鸟二级) | 2010-05-12 22:47

恩,谢谢,复杂的业务还是的用存储过程。不过有些数据库不支持存储过程,如果将来要换数据库还得考虑这个因素

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2011-11-22 17:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册