反射在ADO.NET方面的应用
本来说通过传统的方式可以很方便的访问数据库不需要用到反射技术,但是为了将反射在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方面的应用的更多相关文章
- C#反射在ADO中的巧用
在C#原生开发网站的时候,经常会碰到一个问题,后台用原生查出来的数据一般是DataReader或者是DataTable,这样就把数据从数据库中拿到了,然后就是把数据绑定到前台页面进行输出,这是最原生态 ...
- 反射在ADO.NET中的运用(你还在每个项目中循环遍历DataTable吗)
图片有点大哈,但大更能说明问题.您是不是每个项目都在重复的做图片中的事情-----循环把数据库中返回的表转化为实体对象.是不是每次都在抱怨这样的重复工作.字段越多抱怨越多!不用抱怨了.当你看到这篇文章 ...
- Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装
前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装. Dapper的用法比较接近ADO.NET所以性能也是比较快.所以我们先来看看使用A ...
- js调用wcf 的SOA
jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来 经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传 ...
- 搭建一个BS 的简单SOA 架构(直接通过jquery 调用后台的 wcf 服务的架构)(第一天)
亲们!还在用传统的三层架构吗?你还在对SOA架构 不了解吗? 那就赶快来学习下一个 比较简单的SOA的架构吧!我会手把手的 教会你们怎么搭建这个 简单的SOA的架构. 其中用的技术点保证 WCF,a ...
- C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点
C#反射实现 一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...
- 反射入门-浅谈反射用途_根据Ado游标对象创建list集合
本人大二菜鸟一只,今天在上课期间有个同学看着C#反射的内容说反射没什么用,一时之间也想不到什么更好的例子,就写了个根据泛型类型和游标反射创建List集合的Demo. 首先创建一个用于封装对应数据的en ...
- .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)
自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...
- LINQ-to-SQL那点事~利用反射在LINQ-to-SQL环境中实现Ado.net的CURD操作
回到目录 对于linq to sql提供的CURD操作,给我们的感觉就是简单,容易使用,更加面向对象,不用拼SQL语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合 ...
随机推荐
- 动态规划——Best Time to Buy and Sell Stock IV
这是这个系列题目的第四个,题目大意和之前的差不多,但是这次提供最多k次的操作,操作还是不能同时操作即必须结束前一个操作才能进行后一个操作. 状态比较好理解,就是题目要求的缩小版,dp[k][i]表示进 ...
- anjular分页组件tm-pagination的使用
原组件地址:https://github.com/miaoyaoyao/AngularJs-UI (1)直接从git上clone下来的demo无法正常显示,后来重新到在线的demo上拷贝了templa ...
- PC网站转换成手机版
博客地址:https://www.cnblogs.com/zxtceq/p/5714606.html 一天完成把PC网站改为自适应!原来这么简单! http://www.webkaka.com/blo ...
- 详解Session和cookie
1.cookie 1.1. 为什么会有cookie? 由于HTTP是无状态的,服务端并不记得你之前的状态.这种设计是为了HTTP协议的方便,但是也存在一些问题.比如我们登录一个购物网站,我们需要用户登 ...
- React(九)create-react-app创建项目 + 按需加载Ant Design
(1)create-react-app如何创建项目我前面第一章介绍过了,这里就不过多写了, (2)我们主要来说说按需加载的问题 1. 引入antd npm install antd --save 2. ...
- JVM服务进程挂掉问题定位查询思路
昨天有朋友咨询了个RegionServer宕机找不到日志无法定位原因的问题,干脆就系统整理下JVM服务宕机的可能原因,方便按照思路去找真正的宕机原因. 1. abort()/halt()/exit() ...
- [HACK] docker runtime 挂载宿主机目录
网上看到的很多所谓的挂载都是容器创建时期的挂载,而且参数都不清不楚,整理如下(--name别名自己加): docker run -v /src/path:/dest/path:rw ${IMAGE} ...
- 使用secureCRT和Telnet将文件压缩导出到Ubuntu中,到Ubuntu中加压缩发现:tar解压包的时候出现错误gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now
细节描述: 问题如题所示:查找博客园和CSDN上查找问题,得到问题解决方法大致如下: 1 修改解压缩命令: 由 tar zxvf software_package.tar.gz变为tar xvf so ...
- [VUE]object.defineProperty的基本使用
1.object.defineProperty 给一个对象定义一个新的属性或者在修改一个对象现有的属性,并返回这个对象 语法: Object.defineProperty(参数1,参数2,参数3) 参 ...
- jenkins自动化工具使用教程
自动化构建.测试.部署.代码检测越来越重要.主要有一下几点原因 1. 企业做大,项目变多,多端支持(web,h5,小程序等) 2. 微服务提倡高内聚低耦合,项目因拆分变多 3. DevOps自动 ...