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.之后就是数据库的链接和关闭等操作:
3.对数据库进行读写操作。
//判断是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>,还是利用泛型+反射
5.返回分页,获取PagesList<T>
5.1。分页实体类:
5.2。实现分页,返回PagesList<T>
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 }
哈哈。。写好了。。。有什么写得不好的,希望大家多多指教。拍拍砖。。。
首先就想到了,写一个通用点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
(请您对文章做出评价)