zoukankan      html  css  js  c++  java
  • 反射在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进行赋值操作,比起传统的一个一个写来说不得不说很大程度上解放了双手。

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

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

  • 相关阅读:
    Fixed Function Shader
    sqlserver 2014 数据库作业 通过脚本创建注意事项
    块存储、文件存储、对象存储意义及差异
    程序员如何成为架构师
    那些编程水平很高的程序员是怎么练成的?
    在ASP.NET Core调用WebService
    .net core 调用webservice同步方法
    Sqlserver中如何创建链接服务器
    JWT实现鉴权
    JWT原理实现代码
  • 原文地址:https://www.cnblogs.com/CKExp/p/10520099.html
Copyright © 2011-2022 走看看