本来说通过传统的方式可以很方便的访问数据库不需要用到反射技术,但是为了将反射在ADO.NET中的作用体现出来,特意来试一下改良版的访问方式。

​反射的学习需要一定的时间去理解,我学了有一阵子了,但也不敢保证是将反射学懂了,学无止境,反射的本身也体现了微软的才华。

反射的命名空间是System.Reflectional;项目用到反射之前需要引入,这不像它本身的功能,哈哈,可以动态的加载程序集,而不需要引入的方式,反射尤其名字联想到物理学中的镜面反射,也可以懂其大概意思,就是说通过给你一个程序集的完整路径名,你可以反射出一整套该程序集的信息,这个完整路径名,在很多时候都是通过写在配置文件中的,通过这样也得以将程序实现可配置,通过改变不同的程序集名字,又能实现可扩展性。

废话不多说,现在来看看反射是怎么改良ADO.NET的。

-------------------正题---------------------

这是一种简单的方式访问数据库:

public SysAdmins AdminLogin(SysAdmins
objAdmin)

{

//【1】定义SQL语句

string sql
= "select AdminName,StatusId,RoleId from SysAdmins where
AdminId=@AdminId and LoginPwd=@LoginPwd";

//【2】封装参数

SqlParameter[] param = new SqlParameter[]

{

new
SqlParameter("@AdminId",objAdmin.AdminId),

new
SqlParameter("@LoginPwd",objAdmin.LoginPwd)

};

//【3】执行查询

SqlDataReader objReader = SQLHelper.GetReader(sql, param);

//【4】处理结果

if
(objReader.Read())

{

objAdmin.AdminName =
objReader["AdminName"].ToString();

objAdmin.StatusId =
Convert.ToInt32(objReader["StatusId"]);

objAdmin.RoleId =
Convert.ToInt32(objReader["RoleId"]);

}

else

{

objAdmin = null;

}

objReader.Close();

//【5】返回查询结果

return
objAdmin;

}

通过将表示层的信息进行封装,经过业务逻辑层,再到数据访问层,将信息解包,提取有用信息,并整合到SQL语句中,通过ADO.NET技术访问数据库,数据库内进行一系列项目需要的操作,得到想要的返回结果,并且又封装到原来的包中,整个过程的该部分已经结束,自动忽略一部分细节,毕竟我们主要讲的是该部分。

而后我们通过反射来实现一下:​

#region 反射在数据库方面的应用

public T AdminLoginRefle(T objAdmin)

{

Type type
= typeof(T);

T t =
(T)Activator.CreateInstance(type);

string
column = string.Join(",", type.GetProperties().Select(p
=> string.Format("{0}", p.Name)));

string sql
= string.Format("select {0} from {1} where AdminId={2}", column,
type.Name, type.GetProperty("AdminId").GetValue(objAdmin));

SqlDataReader reader = SQLHelper.GetReader(sql);

if
(reader.Read())

{

foreach (PropertyInfo p in
type.GetProperties())

{

//前提是数据库内的属性和实体类定义的属性相互对应

string pName = p.Name;

p.SetValue(t, reader[pName]);

Console.WriteLine("{0}", p.GetValue(t));

}

}

return
t;

}

#endregion

//整个模块的不同主要在于一开始并不知道要传过来的对象是谁,这是留下的一个迷点,让你一开始就不知道什么情况,其实这是没必要的,只不过为了体现反射的强大而故意为之的,再者​通过Type类这一反射中常用的类来获得传过来的对象的类型,通过Activator.CreateInstane(type)只不过该方法返回的是一个实例但是是object类型的对象,这里在学习的时候会有一个误区出现,即是我并没有引入要的对象的类型,那怎么将它转换呢,不然又怎么去调用需要的功能呢?如果说项目允许引入接口那么可以通过接口类对象来接收该实例并将该实例转换为接口类,毕竟接口其实相当于父类,只不过c#为了安全考虑不允许出现多继承,其实也只是一种形式上转变了,毕竟接口功能也更强大了,如果不需要引入接口,或是不允许引入,那么还有其它方式实现,就好比如说通过methodInfo类,接收一个type.GetMethod("...")返回的需要的方法对象,其参数是提前定义好的方法的名字,也可以写入配置文件中,再次通过method.involve(object,...)也是可以调用其需要的功能,在这里也会有一些黑科技的存在,比如说通过在参数中设置一个叫做nonpublic
设置为true
那么将可以使用私有的保护的功能,嘿嘿,不要多使用这些哟,再回到项目中,这里使用的是属性,那么又存在type.GetProperties()方法,将返回这个类型中所有的属性信息,而GetProperty("...")是返回特定的属性。在后面加一个Select(),是一个泛型方法,我们现在是需要将所有的属性都提取出来并用,将其分割,所以要求的第一个参数是Func委托,返回一个字符串,通过委托将每一个属性整合起来。然后和传统方式一样,访问数据库执行一系列操作,但带回的结果在封装的时候,这次的操作比以前的高效的多了,但是也是有前提条件的,前提是数据库内的属性和实体类定义的属性相互对应,通过获得类型中的属性信息,然后将带回的结果一一对应,并通过setvalue进行赋值操作,比起传统的一个一个写来说不得不说很大程度上解放了双手。

两个项目的运行结果是一样的。这里就不再展示了,写到这里,我也再次的回味了一遍反射带来的浓汁,哈哈。

学习是要花费时间的,这个时间也是有必要的,现实生活,和在编程中的思想其实是有很大的相似性的,有些不理解的东西可以通过现实生活中的模拟也能够得到。​

反射在ADO.NET方面的应用的更多相关文章

  1. C#反射在ADO中的巧用

    在C#原生开发网站的时候,经常会碰到一个问题,后台用原生查出来的数据一般是DataReader或者是DataTable,这样就把数据从数据库中拿到了,然后就是把数据绑定到前台页面进行输出,这是最原生态 ...

  2. 反射在ADO.NET中的运用(你还在每个项目中循环遍历DataTable吗)

    图片有点大哈,但大更能说明问题.您是不是每个项目都在重复的做图片中的事情-----循环把数据库中返回的表转化为实体对象.是不是每次都在抱怨这样的重复工作.字段越多抱怨越多!不用抱怨了.当你看到这篇文章 ...

  3. Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装

    前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装. Dapper的用法比较接近ADO.NET所以性能也是比较快.所以我们先来看看使用A ...

  4. js调用wcf 的SOA

    jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来 经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传 ...

  5. 搭建一个BS 的简单SOA 架构(直接通过jquery 调用后台的 wcf 服务的架构)(第一天)

    亲们!还在用传统的三层架构吗?你还在对SOA架构 不了解吗? 那就赶快来学习下一个 比较简单的SOA的架构吧!我会手把手的 教会你们怎么搭建这个 简单的SOA的架构. 其中用的技术点保证  WCF,a ...

  6. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

  7. 反射入门-浅谈反射用途_根据Ado游标对象创建list集合

    本人大二菜鸟一只,今天在上课期间有个同学看着C#反射的内容说反射没什么用,一时之间也想不到什么更好的例子,就写了个根据泛型类型和游标反射创建List集合的Demo. 首先创建一个用于封装对应数据的en ...

  8. .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)

    自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...

  9. LINQ-to-SQL那点事~利用反射在LINQ-to-SQL环境中实现Ado.net的CURD操作

    回到目录 对于linq to sql提供的CURD操作,给我们的感觉就是简单,容易使用,更加面向对象,不用拼SQL语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合 ...

随机推荐

  1. 元素定位-XPATH定位方法总结

    1.Xpath定位方法探讨 xpath是比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能.如果Xpath使用的比较好,几乎可以定位到任何页面元素,而且受页面变化影响较小. 1.1.什么 ...

  2. java简单框架设计

    设计框架包可以作为一个工具给大家用,需要有完全不同设计思路给出来,不同于我们去做一个web服务.网站. 或者一个业务微服务,需要从原来使用视角转换成一个构建者视角. 框架或者工具,更多是框架来管理或者 ...

  3. 动态规划——Best Time to Buy and Sell Stock IV

    这是这个系列题目的第四个,题目大意和之前的差不多,但是这次提供最多k次的操作,操作还是不能同时操作即必须结束前一个操作才能进行后一个操作. 状态比较好理解,就是题目要求的缩小版,dp[k][i]表示进 ...

  4. PBRT笔记(11)——光源

    自发光灯光 至今为止,人们发明了很多光源,现在被广泛使用的有: 白炽灯的钨丝很小.电流通过灯丝时,使得灯丝升温,从而使灯丝发出电磁波,其波长的分布取决于灯丝的温度.但大部分能量都被转化为热能而不是光能 ...

  5. Dancing Links 学习笔记

    Dancing Links 本周的AI引论作业布置了一道数独 加了奇怪剪枝仍然TLE的Candy?不得不去学了dlx dlxnb! Exact cover 设全集X,X的若干子集的集合为S.精确覆盖是 ...

  6. [JZOJ3615]【NOI2014模拟】数列(平面几何+二维线段树)

    Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的f值为两者位置差与数值差的和,即f(x,y)=|x-y|+|a[x]-a[y]|. 你需要写一个程序支持2种操作(k都是正 ...

  7. python学习:字符串

    字符串 #字符串操作# 对应操作:# 1.重复输出字符串# print('hello'*2)# 2.[],[:]通过索引获取字符串中字符,这里和列表的切片操作是相同的,具体内容见列表#print('h ...

  8. C#三目运算符

    在编写项目的时候,会经常用到 if else 判断语句,但有些简单的判断或赋值,可以通过三目运算符来完成! 例如: int sex=0; string sexText=""; if ...

  9. zookeeper使用和原理探究

    转:http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html zookeeper介绍 zookeeper是一个为分布式应用提供一致 ...

  10. 201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: ‐多线程 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. ...