C#利用反射实现多数据库访问
在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。
项目整体结构如下图所示:
1、Database.Instance是一个类库文件,IDBHelper是一个接口,封装的访问数据库数据的CURD方法,OracleDBHelper和SQLServerDBHelper类实现IDBHelper接口,分别用来访问Oracle数据库和SQL Server数据库,接口和类的定义如下:
IDBHelper接口定义
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Database.Instance.Interface { public interface IDBHelper { /// <summary> /// 创建数据 /// </summary> void Create(); /// <summary> /// 更新数据 /// </summary> void Update(); /// <summary> /// 读取数据 /// </summary> void Retrieve(); /// <summary> /// 删除数据 /// </summary> void Delete(); } }
OracleDBHelper类定义如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Database.Instance.Interface; namespace Database.Instance.Oracle { public class OracleDBHelper :IDBHelper { public void Create() { Console.WriteLine("这是Oracle数据库执行创建操作"); } public void Update() { Console.WriteLine("这是Oracle数据库执行更新操作"); } public void Retrieve() { Console.WriteLine("这是Oracle数据库执行读取操作"); } public void Delete() { Console.WriteLine("这是Oracle数据库执行删除操作"); } } }
SQLServerDBHelper类定义如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Database.Instance.Interface; namespace Database.Instance.SQL_Server { public class SQLServerDBHelper:IDBHelper { public void Create() { Console.WriteLine("这是SQL Server数据库执行创建操作"); } public void Update() { Console.WriteLine("这是SQL Server数据库执行更新操作"); } public void Retrieve() { Console.WriteLine("这是SQL Server数据库执行读取操作"); } public void Delete() { Console.WriteLine("这是SQL Server数据库执行删除操作"); } } }
2、MyReflection是一个控制台程序,用来测试
一、使用原始方法实现
使用原始的方法实现代码如下:
using Database.Instance.Interface; using Database.Instance.Oracle; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Configuration; namespace MyReflection { class Program { static void Main(string[] args) { // 实例化(调用Oracle数据库) IDBHelper dbHelper = new OracleDBHelper(); // 调用方法 dbHelper.Create(); dbHelper.Update(); dbHelper.Retrieve(); dbHelper.Delete(); Console.ReadKey(); } } }
程序运行结果:
存在的问题:如果换一种数据库,那么就需要修改实例化的代码,例如更换SQL Server数据库,那么代码修改如下:
IDBHelper dbHelper = new SQLServerDBHelper();
这样很不方便,每次更换数据库的时候,都需要修改实例化的代码,有没有什么方便的方法可以做到不需要修改代码就可以实现更换数据库呢?办法就是使用反射加配置文件实现。
二、使用反射加配置文件实现
配置文件结构如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <!--key表示定义的接口 value格式 要加载的程序集名称,要实例化的类 value值中间以','分割--> <add key="Database.Instance.Interface.IDBHelper" value="Database.Instance,Database.Instance.Oracle.OracleDBHelper"/> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /> </startup> </configuration>
Program类定义如下:
using Database.Instance.Interface; using Database.Instance.Oracle; using Database.Instance.SQL_Server; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Configuration; namespace MyReflection { class Program { static void Main(string[] args) { // 根据key值读取对应的value值 string[] config = ConfigurationManager.AppSettings["Database.Instance.Interface.IDBHelper"].Split(','); // 加载程序集 config[0]=Database.Instance Assembly assembly = Assembly.Load(config[0]); // 根据类的完全限定名找出类型 config[1]= Database.Instance.Oracle.OracleDBHelper Type type = assembly.GetType(config[1]); // 根据类型创建对象 object obj = Activator.CreateInstance(type); //实例化 IDBHelper dbHelper = obj as IDBHelper; dbHelper.Create(); dbHelper.Update(); dbHelper.Retrieve(); dbHelper.Delete(); Console.ReadKey(); } } }
运行结果如下:
如果更新数据库,只需要更新配置文件中value的值即可,例如要更换SQL Server数据库,配置文件修改如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <!--key表示定义的接口 value格式 要加载的程序集名称,要实例化的类 value值中间以','分割--> <add key="Database.Instance.Interface.IDBHelper" value="Database.Instance,Database.Instance.SQL_Server.SQLServerDBHelper"/> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /> </startup> </configuration>
Program类不需要修改,运行结果如下:
到此这篇关于C#利用反射实现多数据库访问的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
C#线程委托BeginInvoke与EndInvoke的用法
这篇文章介绍了C#线程委托BeginInvoke与EndInvoke的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-07-07Unity InputFiled TMP属性和各种监听示例详解
这篇文章主要为大家介绍了Unity InputFiled TMP属性和各种监听示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-01-01
最新评论