反射在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条的集合 ...
随机推荐
- 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼
目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...
- 发现Chrome 浏览器 JavaScript Date对象的几个Bug
打开浏览器F12 Console 输入: 第一个 位数影响 new Date("2018-06-9") Sat Jun 09 2018 00:00:00 GMT+0800 (中国标 ...
- Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(2)
ItemTouchHelper类 之前我们实现了滑动列表的一些基本功能,为了实现更多的效果,我们来仔细看一下ItemTouchHelper中的类: ItemTouchHelper.SimpleCall ...
- NOIP2012提高组day2 T2借教室
这题骗分可以骗到满分(可能是数据不太强给强行过去了) 这道题如果是按照题意去模拟用循环去修改区间的话只有45分,正解是二分+差分数组,骗分也是差分数组但是没有使用二分,时间复杂度在最坏的情况下是O(n ...
- input框中修改placeholder的样式
有时间input标签的placeholder属性会出现问题,下面是修改placeholder的样式demo input::-webkit-input-placeholder{ color:red; f ...
- It is difficult to the point of impossiblity for sb to image a time when ...
对sb而言很难想象一段..的时光.
- Angular 2项目的环境配置和项目搭建
AngularJS2 发布于2016年9月份,它是基于ES6来开发的. AngularJS2 是一款开源JavaScript库,由Google维护,用来协助单一页面应用程序运行.AngularJS2 ...
- MVC5 Razor视图中不规范书写导致的编译问题
今天碰到一个非常让人难以理解的问题,如图所示,但是我在代码中并没有找到缺失"}"的地方: 根据源文件提示有去 AppData\Local\Temp\Temporary ASP.NE ...
- window下如何使用文本编辑器(如记事本)创建、编译和执行Java程序
window下如何使用文本编辑器(如记事本)创建Java源代码文件,并编译执行 第一步:在一个英文目录下创建一个 .text 文件 第二步:编写代码 第三步:保存文件 方法一:选择 文件>另存为 ...
- Vue知识点总结
1.属性名已$开头的都是内部提供的属性 2.为什么使用事件修饰符的原因:methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节 3.v-if 如果值为false,元素在页面中不存在:值为t ...