服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#利用反射实现多数据库访问

C#利用反射实现多数据库访问

2023-02-17 12:10.NET开发菜鸟 C#

本文详细讲解了C#利用反射实现多数据库访问的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。

项目整体结构如下图所示:

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();
      }
  }
}

程序运行结果:

C#利用反射实现多数据库访问

存在的问题:如果换一种数据库,那么就需要修改实例化的代码,例如更换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();
      }
  }
}

运行结果如下:

C#利用反射实现多数据库访问

如果更新数据库,只需要更新配置文件中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#利用反射实现多数据库访问的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/dotnet261010/p/8276870.html

延伸 · 阅读

精彩推荐
  • C#基于C#实现网络爬虫 C#抓取网页Html源码

    基于C#实现网络爬虫 C#抓取网页Html源码

    这篇文章主要为大家详细介绍了基于C#实现网络爬虫的相关资料,即C#抓取网页Html源码,感兴趣的小伙伴们可以参考一下...

    小虾Joe11612021-11-16
  • C#C#编写SqlHelper类

    C#编写SqlHelper类

    在C#中使用ADO.NET连接数据库的时候,每次连接都要编写连接,打开,执行SQL语句的代码,很麻烦,编写一个SqlHelper类,把每次连接都要写的代码封装成方法...

    AMortal4042022-01-22
  • C#C#环形队列的实现方法详解

    C#环形队列的实现方法详解

    这篇文章先是简单的给大家介绍了什么是环形队列和环形队列的优点,然后通过实例代码给大家介绍C#如何实现环形队列,有需要的朋友们可以参考借鉴,...

    独孤飞7402021-12-07
  • C#C#基础知识之new关键字介绍

    C#基础知识之new关键字介绍

    在 C# 中,new 关键字可用作运算符、修饰符或约束,本文主要介绍这三种用法。...

    Swich11052021-11-19
  • C#用C#绘制九宫格形式的图片

    用C#绘制九宫格形式的图片

    大家好,本篇文章主要讲的是用C#绘制九宫格形式的图片,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下...

    gc_22998562022-12-22
  • C#C#多线程系列之进程同步Mutex类

    C#多线程系列之进程同步Mutex类

    本文详细讲解了C#多线程中的进程同步Mutex类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    痴者工良3662022-12-29
  • C#.NET C#利用ZXing生成、识别二维码/条形码

    .NET C#利用ZXing生成、识别二维码/条形码

    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。这篇文章主要给大家介绍了.NET C#利用ZXing生成、识...

    C#教程网9882021-12-14
  • C#C#实现Winform版计算器

    C#实现Winform版计算器

    这篇文章主要为大家详细介绍了C#实现Winform版计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    C#教程网4582021-11-21