SQLHelper类,泛型+反射

        自己一直都是学习使用asp.net mvc框架+linQ的,所以对于ado.net基本上一无所知,最近接了个小项目,所以打算学习+用ado.net来完成。
        首先就想到了,写一个通用点SQLHelper类来辅助完成数据库的操作。

1.定义一个类:public class SQLHelper<T> where T : class, new()
        说明:SQLHelper有一个T的泛型类型,T属于class,new(),否则T就不能T t =new T()这样使用new关键字了!

2.之后就是数据库的链接和关闭等操作:
Code

3.对数据库进行读写操作。
Code
解释:
        //判断是SQL语句中参数的值对象是否为空
        //例如:new{Id=1,Name="Test"}
            if (obQuery != null)
            {
            //获取SQL语句中参数的值对象中的属性类型和值
                PropertyInfo[] pis = obQuery.GetType().GetProperties();
            //循环遍历对象中的属性
                foreach (var p in pis)
                {
              //利用反射将Id,Name等值填充到SQL语句中的参数中
                    command.Parameters.Add(new SqlParameter(p.Name, p.GetValue(obQuery, null)));
                }
            }

查询操作中,返回的是SQLDataReader对象,如何获取我们所需要的列表,分页,单个实体呢?
4.返回列表List<T>,还是利用泛型+反射
Code

5.返回分页,获取PagesList<T>
5.1。分页实体类:
Code

5.2。实现分页,返回PagesList<T>
Code

6.获取单个实体类:T

 1         /// <summary>
 2         /// 获取单个实体
 3         /// </summary>
 4         /// <param name="strSQL">SQL语句</param>
 5         /// <param name="obQuery">SQL参数的值</param>
 6         /// <returns></returns>
 7         public T GetTM(string strSQL, object obQuery)
 8         {
 9             //调用执行查询语句,返回SqlDataReader
10             SqlDataReader reader = ExecReader(strSQL, obQuery);
11             //新建一个T类型
12             T model = new T();
13             //获取T类型的属性类型和值
14             PropertyInfo[] pis = model.GetType().GetProperties();
15             //获取数据库返回数据的列数
16             int intColCount = reader.FieldCount;
17             //读取数据,填充T
18             if (reader.Read())
19             {
20                 int value_number = 0;
21                 for (int i = 0; i < intColCount; i++)
22                 {
23                     pis[i].SetValue(model, reader.GetValue(value_number), null);
24                     value_number++;
25                 }
26             }
27 
28             return model;
29         }

7.调用方法:ResumeTM为数据库表的实体类

 1 public List<ResumeTM> GetResumeByJobInfoId(int intJobInfoId)
 2         {
 3             SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
 4 
 5             string strSQL = @"select * from Resume where FirstJobId=@JobInfoId or SecondJobId=@JobInfoId order by CreateTime desc";
 6 
 7             object obQuery = new { JobInfoId=intJobInfoId};
 8 
 9             List<ResumeTM> list = helper.GetList(strSQL, obQuery);
10 
11             helper.CloseConnect();
12 
13             return list;
14         }
15 
16         public ResumeTM GetResumeById(int intId)
17         {
18             SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
19 
20             string strSQL = @"select * from Resume where Id=@Id";
21 
22             object obQuery = new { Id=intId};
23 
24             ResumeTM tm = helper.GetTM(strSQL, obQuery);
25 
26             helper.CloseConnect();
27 
28             return tm;
29         }
30 
31         public PagedList<ResumeTM> GetResume(int intPageIndex, int intPaegSize)
32         {
33             SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
34 
35             string strTotalCount = @"select count(*) from Resume";
36 
37             string strSQL = @"select * from
38                              (
39                                 select row_number() over(order by CreateTime desc) as row_number,* from Resume
40                              ) as t0
41                             where t0.row_number between @intPageSize*(@intPageIndex-1)+1 and @ingPageSize*@intPageIndex";
42             object obQuery = new { intPageSize=intPaegSize,intPageIndex=intPageIndex};
43 
44             PagedList<ResumeTM> list = helper.GetPageList(strTotalCount, null, strSQL, obQuery, intPageIndex, intPaegSize);
45 
46             helper.CloseConnect();
47 
48             return list;
49         }
50 
51         public void Delete(int intId)
52         {
53             SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
54 
55             string strSQL = @"delete from Resume where Id=@Id";
56 
57             object obQuery = new { Id=intId};
58 
59             helper.ExecNoQuery(strSQL, obQuery);
60 
61             helper.CloseConnect();
62         }

哈哈。。写好了。。。有什么写得不好的,希望大家多多指教。拍拍砖。。。

2
0
(请您对文章做出评价)
« 上一篇:Unity+单例模式的依赖注入
posted @ 2009-12-10 12:28  陈星  阅读(565)  评论(0编辑  收藏  举报