利用Attribute特性简化多查询条件拼接sql语句的麻烦

       最近公司在做武汉公交信息化管理系统,做这种管理项目,最让人痛苦的就是表单的添加、修改、查询。添加、修改在我以前的文章中提到过,利用反射机制可以做到基本不写代码来完成。参见《 ORM框架实现数据的自动绑定添加修改 <一>》。(不过遗憾的是,目前做的项目中没使用,还是在痛苦的写赋值语句)

        上文中只是解决了添加、修改、显示列表的问题,但是在多关键字查询的时候就又要开始赋值和拼接字符串啦。为了偷懒和省去那些让人讨厌的烦琐事情俺就又开始想取巧的办法啦。

        多关键字查询,一般的处理方法是,取出这些查询条件,然后拼接成字符串,然后传个数据层的函数,然后返回DatSet一类的数据集。在这个过程中有几个让人讨厌的地方:

  1. 查询条件过多的时候,参数名就会n多。代码不好看
  2. 需要连接字符串,并且判断具体要求是like 还是 =
  3. 当查询条件变化或者查询要求变化时改代码很是麻烦,容易出错

       第一个比较好解决,把这些参数声明成一个类直接当参数传进去就行啦。我们现在项目就是这样做的

       第二个就比较麻烦啦。怎么样让这些参数知道自己是什么操作呢?也可以说怎么让程序自动的知道这些属性要做什么操作呢?Attribute 对就是这个玩意。.net中这个像洗盘一样的类。把他吸到参数上面,然后把操作符传给他不就行啦!

代码很简单,简单写一下:

首先声明一个带一个属性的Attribute,用这个属性来存操作符

[AttributeUsage(AttributeTargets.Field)]  // 此属性只能用在Field上
public   class  OpAttribute : Attribute
{
  
private   string  _op  =   string .Empty;
  
public  OpAttribute( string  op)
  {
    _op 
=  op;
  }
 
public   string  Name
 {
   
get  {  return  _op; }
   
set  { _op  =  value; }
 }
}

然后在查询条件的类中加上这些Attribute


public   class  AttributeClass
{
  [OpAttribute(
" = " )]
  
public   int  MyProperty;
  [OpAttribute(
" = " )]
  
public   string  aa;
  [OpAttribute(
" like " )]
  
public   string  bb;
}

然后再调用一个组合sql语句的方法

AttributeClass ac  =   new  AttributeClass();
ac.MyProperty 
=   11 ;
ac.aa 
=   " abcd " ;
ac.bb 
=   " 我唉你 " ;
string  sql = " 1=1 " ;
Type type 
=   typeof (AttributeClass);
foreach  (System.Reflection.FieldInfo fieldInfo  in  type.GetFields())
{
  
foreach  (Attribute at  in  fieldInfo.GetCustomAttributes( true ))
  {
     OpAttribute att 
=  at  as  OpAttribute;
     
if  (att  !=   null )
     {
        sql 
+=   "  and  "   +  fieldInfo.Name  + "   " +  att.Name + "   " +  fieldInfo.GetValue(ac);
     }
  }
}

大功告成。简单实用。当你的查询条件有数十个的时候,这种方法就太方便啦。当然这个只是思路具体还是要完善的。比如实现or操作或者group by操作等等。还可以把这个拼接字符串的方法写成一个积累,这样这个AttributeClass就会自己来拼接字符串啦!

转载于:https://www.cnblogs.com/SoulStore/archive/2008/05/30/1210472.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值