本来说通过传统的方式可以很方便的访问数据库不需要用到反射技术,但是为了将反射在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. ssh登录远程服务器

    在终端输入ssh 用户名@IP地址, 比如输入用户名和密码,进入目录,即可查看修改文件,启动服务. 这和安装xshell和filelizza,终端有什么区别? useradd  guangbo pas ...

  2. webstorm2018.2.3激活

    一,简介 WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.目前已经被广大中国JS开发者誉为"Web前端开发神器"."最强大的HTML5编 ...

  3. linux视频录制,推流处理

    1.linux视频合成(视频后缀要一致) ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -lavfi hstack=inputs=3 4.mp4 (input=3表示希望合并的视 ...

  4. python学习:字典

    字典 1.查询内存地址 a = 10 print(id(a)) b = a print(id(b)) b = 15 print(id(b)) 2. 数据类型 不可变类型:整型.字符串.元组 可变类型: ...

  5. 马昕璐 201771010118《面向对象程序设计(java)》第十六周学习总结

    第一部分:理论知识学习部分 程序:一段静态的代码,应用程序执行的蓝本. 进程:是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 多线程:进程执行过程中产生的多条执行线索,比进程 ...

  6. h5适配的解决方案

    一. 流程 设计师以750pt×1334pt尺寸进行设计(当然高度随内容变化),最后用该尺寸的设计稿进行标注.切图,前端采用淘宝的开源方案flexible进行适配. 二. flexible使用方法 F ...

  7. vue 验证电话

    <el-form :model="orderaddForm" :rules="rulesPhone" ref="orderaddForm&quo ...

  8. A_B_Good Bye 2018_cf

    A. New Year and the Christmas Ornament time limit per test 1 second memory limit per test 256 megaby ...

  9. 反编译python打包的exe文件

    目录 1.前言 2.使用环境 3.还原过程 4.号外 5.exe文件和所用到的反编译工具 6.参考 7.去签名(补漏) 前言 拿到了利用驱动人生进行传播的病毒样本,发现是python打包成的exe文件 ...

  10. 「深度剖析」程序员因为奇葩需求暴打pm,然后被双双开除

    想必大家都听说了,这两天关于中国平安一个产品经理因奇葩需求和程序员爆发肢体冲突的事件在朋友圈被刷屏,更有现场打架视频在技术群里疯传. 在这里先带大家简单文字回顾下事情经过,N次打架视频和截图就不给大家 ...