首页 新闻 会员 周边 捐助

三层结构中UI层的条件如何传到DAL层?

0
悬赏园豆:200 [已解决问题] 解决于 2012-03-15 16:52

在数据层中的有一字段如:ID,我想根据条件执行相应的查询如:ID=100,id>100,或者NAME="P"  NAME LIKE %P%之类的条件,

在UI层我是传了一个实体到BLL再到DAL中的,再根据实体生成查询字符串。现在我想“=”,“》”,“LIKE"等复杂条件是如何传递到数据访问题的?请问有什么更好的方法解决这个问题。谢谢

谢谢各位的答案,但是一个字段是可以解决这个问题,但是我的条件可能是多个字段组成的,又不是所以字段都是必需的查询条件。有没有更好的解决方案。谢谢

问题补充:

如public class pClass{int id,string name}

GetbyIDDAL(pClass p)

{

if(p.id>0)

{

  //问题在这里。我想知道如何根据UI层的条件选择大于还是等于。

  sql+="ID>"+p.id

  //sql+="ID="+p.id}

}

UI层:

pClass pp=new pClass();

pp.id=100;

GetByIDUI(pp);

我现在的做法大概是这样思路,难道要传SQL(" WHERE ID>100"或 "where Name like %q%"之类的)?

苍龙95的主页 苍龙95 | 初学一级 | 园豆:20
提问于:2012-03-15 15:55
< >
分享
最佳答案
1

1,你可以直接传一个字符串"id=100"这样的到DAL层,

2,你可以传个实体,包含“id”,100,和查询的类型等信息,在DAL层你自动组装。查询的类型就是=,>,like等。你你上面的代码,你先加一个枚举,pClass类中你再加一个string type属性,或别用string用枚举,然后传值的时候你就能知道怎么选择是大于还是等于了。

if(p.id>0)

{

  sql+="ID"+type+p.id;

}

收获园豆:180
LCM | 大侠五级 |园豆:6876 | 2012-03-15 16:03

传个查询类型是可以。但是实体可能会有很多个字段。各个字段可能会组成不同的查询条件,就是这个查询类型怎么和实段对应呢?谢谢

苍龙95 | 园豆:20 (初学一级) | 2012-03-15 16:08

而且不是每个字段都必需有查询条件的。

苍龙95 | 园豆:20 (初学一级) | 2012-03-15 16:09

@苍龙95: 你还是直接拼好条件再传入吧。比如:

GetbyIDDAL(string strWhere)
{
if(strWhere!=null&&strWhere!="")
{
sql+="where "+strWhere;
  //问题在这里。我想知道如何根据UI层的条件选择大于还是等于。
 
// sql+="ID>"+p.id
  
//sql+="ID="+p.id}
}
}
UI层:

GetByIDUI("id>100");

GetByIdUI("");
LCM | 园豆:6876 (大侠五级) | 2012-03-15 16:13

@LCM: 拼SQL是可以,很简单。但是大家都UI层不要SQL,所以很麻烦。

苍龙95 | 园豆:20 (初学一级) | 2012-03-15 16:17

@苍龙95: 你说的不是每个字段都有查询条件,是什么意思?拼字符串的话,你随便有多少个字段有多少查询条件都可以的啊,假如没有的话就传入空值,有多个的话把多个条件用and 或or连接起来就行了。

LCM | 园豆:6876 (大侠五级) | 2012-03-15 16:18

@LCM: 拼字符串我知道怎么做,我是说如果加类型的话,一个实体有多个字段,如class p {int id,string naem,....}

我传到数据层的实体如ID,可能有“=”,“>","<", ">"等,但是有可能NAME等也要在查询中。这时候这个类型和字段就对应不上了。

苍龙95 | 园豆:20 (初学一级) | 2012-03-15 16:27

@苍龙95: 

@苍龙95: 另外,你可以这样

public class pClass{string feildName,string fieldValue,string type}
GetbyIDDAL(List<pClass> listFilter)
{
if(listFilter!=null&&listFilter.Count>0)
{
//没有拼接前的sql语句应该是这样的 select * from table where 1=1
foreach(string filter in listFilter)
{
//这里还可以判断一下是like的特殊情况不是下面这样拼sql的,需要加%
sql+= “ and ” +filter.feildName+type ="'"+fieldValue+"'";
}
}



UI层:这样你就可以按很多的条件进行拼接了,随便多少条件都行
GetByIDUI(list);

LCM | 园豆:6876 (大侠五级) | 2012-03-15 16:28

@LCM: 呵呵。这样是可以,但总觉得和传SQL字符串差不多,不知道你在项目中如果有这种复杂查询是传SQL还是怎么做的?

苍龙95 | 园豆:20 (初学一级) | 2012-03-15 16:38

@苍龙95: 传sql查询条件的比较多,方便些。比如传一个 “id<100 and name like 'lcm%' ",但这一般是从BLL层向DAL层传,而UI层只传100和lcm到BLL层,然后调用BLL层相应的方法。

LCM | 园豆:6876 (大侠五级) | 2012-03-15 16:44

@LCM: 谢谢了。看来只能在传SQL了。。呵呵

苍龙95 | 园豆:20 (初学一级) | 2012-03-15 17:34
其他回答(1)
0

在你的方法上加一个类型控制,

if(type==1){ID=100}

else (type==2){id>100}...

收获园豆:20
self | 园豆:182 (初学一级) | 2012-03-15 16:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册