通过反射生成SQL的例子

系统 1741 0

  全文摘自http://www.cnblogs.com/g1mist/p/3227290.html,很好的一个实例。

  反射提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

  1.先建立实体类

  用户实体类:

1
2
3
4
5
6
7
8
9
public class User
     {
         public int id { get ; set ; }
         public string UserName { get ; set ; }
         public string Password { get ; set ; }
         public int Age { get ; set ; }
         public string PhoneNumber { get ; set ; }
         public string Address { get ; set ; }
     }

  书籍实体类:

1
2
3
4
5
6
7
8
public class Book
    {
        public int id { set ; get ; }
        public string BookName { get ; set ; }
        public string ISBN { set ; get ; }
        public string Author { set ; get ; }
        public double Price { set ; get ; }
    }

  2.通过反射技术来生成Insert语句(举个例子而已,只生成Insert语句)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
   /// <summary>
   /// 泛型方法,反射生成SQLInsert语句
/// </summary>
   /// <typeparam name="T">实体类型</typeparam>
   /// <param name="entity">实体对象</param>
   /// <returns></returns>
   public string CreateInsertSQL<T>(T entity)
   {
       //1.先获取实体的类型描述
       Type type = entity.GetType();
       //2.获得实体的属性集合
       PropertyInfo[] props = type.GetProperties();
 
       //实例化一个StringBuilder做字符串的拼接
   StringBuilder sb = new StringBuilder();
 
       sb.Append( "insert into " + type.Name + " (" );
 
       //3.遍历实体的属性集合
       foreach (PropertyInfo prop in props)
       {
           //4.将属性的名字加入到字符串中
      sb.Append(prop.Name + "," );
       }
       //**去掉最后一个逗号
    sb.Remove(sb.Length - 1, 1);
       sb.Append( " ) values(" );
 
       //5.再次遍历,形成参数列表"(@xx,@xx@xx)"的形式
       foreach (PropertyInfo prop in props)
       {
           sb.Append( "@" + prop.Name + "," );
       }
       //**去掉最后一个逗号
       sb.Remove(sb.Length - 1, 1);
       sb.Append( ")" );
 
       return sb.ToString();
   }

  3.测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Program
     {
         static void Main( string [] args)
         {
//调用ReflationCreateSQL类中的CreateInsertSQL方法          
         string sql = new ReflationCreateSQL().CreateInsertSQL( new User());
             string sql1 = new ReflationCreateSQL().CreateInsertSQL( new Book());
 
             Console.WriteLine(sql.ToString());
             Console.WriteLine(sql1.ToString());
 
             Console.WriteLine( "Press any key to continue . . ." );
             Console.ReadLine();
         }
     }

  结果:

  但是,我们发现id是主键,假设id是自增长的,我们生成的SQL(Insert)语句中就不应该有id,在这里我用自定义Attribute的方法来解决这个问题。

  4.先新建一个类,继承Attribute类

1
2
3
4
public class KEYAttribute : Attribute
{
 
}

  这个类仅此而已就够了。

  5.在实体类中的id这个字段上加上[KEY]标记

1
2
3
4
5
6
7
8
9
public class Book
     {
         [KEY]
         public int id { set ; get ; }
         public string BookName { get ; set ; }
         public string ISBN { set ; get ; }
         public string Author { set ; get ; }
         public double Price { set ; get ; }
     }

 

1
2
3
4
5
6
7
8
9
10
public class User
    {
        [KEY]
        public int id { get ; set ; }
        public string UserName { get ; set ; }
        public string Password { get ; set ; }
        public int Age { get ; set ; }
        public string PhoneNumber { get ; set ; }
        public string Address { get ; set ; }
    }

  6.加好标记之后,我们只需要这CreateInsertSQL<T>(T entity)这个方法中的两个foreach循环体中加一些判断即可

1
2
3
4
5
6
7
8
9
10
11
12
foreach (PropertyInfo prop in props)
            {
                //获取用户自定义标记集合
           object [] attrs = prop.GetCustomAttributes( typeof (KEYAttribute), true );
                //如果属性上有自定义标记KEYAttribute,退出本次循环
            if (attrs.Length > 0)
                {
                    continue ;
                }
                //将属性的名字加入到字符串中
           sb.Append(prop.Name + "," );
            }

1
2
3
4
5
6
7
8
9
foreach (PropertyInfo prop in props)
             {
                 object [] attrs = prop.GetCustomAttributes( typeof (KEYAttribute), true );
                 if (attrs.Length > 0)
                 {
                     continue ;
                 }
                 sb.Append( "@" + prop.Name + "," );
             }

  7.测试

通过反射生成SQL的例子

通过反射生成SQL的例子


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论