C#利用反射实现多数据库访问
作者:.NET开发菜鸟 时间:2024-01-27 12:00:58
在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。
项目整体结构如下图所示:
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类不需要修改,运行结果如下:
来源:https://www.cnblogs.com/dotnet261010/p/8276870.html
标签:C#,反射,多数据库,访问
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python Pygame实现俄罗斯方块
2023-03-17 07:18:03
![](https://img.aspxhome.com/file/2023/8/77898_0s.jpg)
T-SQL问题解决集锦 数据加解密全集
2012-07-11 15:34:08
ASP 使用三层架构 asp中使用类
2011-03-16 10:52:00
Matplotlib绘制子图的常见几种方法
2022-04-04 06:19:47
![](https://img.aspxhome.com/file/2023/8/102338_0s.png)
python 显示数组全部元素的方法
2021-03-20 13:15:01
django实现同一个ip十分钟内只能注册一次的实例
2021-03-07 03:13:37
发现一个不错的11px字体:PMingLiu
2008-09-06 12:49:00
Mysql连接本地报错:1130-host ... is not allowed to connect to this MySQL server解决
2024-01-28 04:52:50
![](https://img.aspxhome.com/file/2023/0/129920_0s.png)
Python3逻辑运算符与成员运算符
2021-03-29 18:59:14
python从ftp下载数据保存实例
2022-10-07 13:32:17
PHP getName()函数讲解
2023-06-06 08:28:25
![](https://img.aspxhome.com/file/2023/6/55406_0s.png)
mac下如何将python2.7改为python3
2023-12-07 17:14:43
![](https://img.aspxhome.com/file/2023/2/112822_0s.jpg)
网站有效设计的10个原则
2008-02-11 17:12:00
![](https://img.aspxhome.com/file/UploadPic/up/2008021118383957.gif)
JavaScript Alert通用美化类
2024-04-27 15:20:50
用SQL语句完成SQL Server数据库的修复
2008-11-24 20:49:00
如何在Python中用好短路机制
2022-04-23 16:56:42
![](https://img.aspxhome.com/file/2023/1/121771_0s.webp)
python爬虫之自动登录与验证码识别
2022-05-18 07:22:53
Python爬虫爬取电影票房数据及图表展示操作示例
2021-07-18 08:34:32
![](https://img.aspxhome.com/file/2023/9/103599_0s.png)
C/C++ 连接MySql数据库的方法
2024-01-27 08:40:36
![](https://img.aspxhome.com/file/2023/1/114941_0s.png)
CSS选择符小讲
2009-09-17 11:53:00