使用反射实现多数据库的支持

    技术2022-05-11  130

    现今数据库行业中可供选择的数据库有很多,Oracle,SQL,Access等等,而且不同的数据库又有不同的标准,即使同样由微软推出的SQL和Access也有一些语句是SQL支持而Access不支持的,就更不要说其它的特性了。那么,如果我们的用户是未知的,并不知道将来使用这个系统的用户使用的是什么数据库,这时,我们就需要让我们的系统支持多数据库选择了!

    这里我们以一个简单的web应用程序为例,我们需要这个系统能够支持SQL和Access数据库,而用户可以选择当前是使用SQL还是使用Access来做为数据库。其目的是从数据库中读取指定序号的数据,然后在页面中进行修改,再将修改后的内容保存进数据库。

    要实现这样一个功能我们需要两个对数据库的操作,一个是从数据库中读取数据,一个是将数据更新到数据库中,因此我们先添加一个抽象类DataProvider,其中有两个可重写的方法GetData()和UpdateData(),再添加两个类SqlDataProvider和AccessDataProvider,并从DataProvider继承,以不同的实现方式重写基类中的两个方法。

    问题也随之而来,在程序的运行过程中是根据配置文件中的内容来决定使用中个类来进行操作的,我们并

    不知道应该实例化哪个类,或者调用哪个类的方法。这时我们就要用户标题中所说的反射技术来实现,反射可以让我们动态的实例化一个类,或调用一个方法。首先我们在配置文件中给出SQL的连接字符串和数据操作类的全名,所谓全名大家可能见过,是以这样的格式出现的

    "包含完全命名空间的类名,该类所在的程序集的名称",

    这时我们就可以在程序中根据配置文件中指定的数据操作类来实例化需要的类,并调用其方法!代码如下:Type type = null;type = Type.GetType("从配置文件获取的数据操作类全名");

    //要寻找的构造函数所使用的参数类型集合Type[] paraTypes = new Type[2];paraTypes[0] = typeof(string);paraTypes[1] = typeof(string);

    //获取与参数类型集合相匹配的构造函数信息System.Reflection.ConstructorInfo constructorInfoObj = type.GetConstructor(paraTypes);

    //给要调用的构造函数的两个参数赋值并将其放在一个数组中object[] paraObj = new object[2];paraObj[0] = "aaaa";paraObj[1] = "bbbb";//调用该构造函数DataProvider dataProvider = (DataProvider)constructorInfoObj.Invoke(paraObj);

    这时就可以调用dataProvider的两个方法来进行操作。

    以上只是简单的部分代码。至于Web.Config中你是使用哪种方法来定义就跟据你自己的情况来决定了。


    最新回复(0)