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

 更新时间:2022年03月07日 11:12:34   作者:.NET开发菜鸟  
本文详细讲解了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#使用正则表达式过滤html标签

    C#使用正则表达式过滤html标签

    最近在开发一个项目,其中有需求要求我们把一段html转换为一般文本返回,使用正则表达式是明智的选择,下面小编给介绍下C#使用正则表达式过滤html标签,需要的朋友参考下
    2016-08-08
  • C#实现按数据库邮件列表发送邮件的方法

    C#实现按数据库邮件列表发送邮件的方法

    这篇文章主要介绍了C#实现按数据库邮件列表发送邮件的方法,涉及C#读取数据库及通过自定义函数发送邮件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • WPF绑定实例详解

    WPF绑定实例详解

    这篇文章主要介绍了WPF绑定的用法,包括了WPF绑定控件及非控件对象的用法,以及各类参数的详细用法,需要的朋友可以参考下
    2014-09-09
  • C# web应用程序不能访问app_code下类的原因以及解决方法

    C# web应用程序不能访问app_code下类的原因以及解决方法

    本文主要介绍了C#web应用程序不能访问app_code下类的原因以及解决方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C#实现将HTML转换成纯文本的方法

    C#实现将HTML转换成纯文本的方法

    这篇文章主要介绍了C#实现将HTML转换成纯文本的方法,基于自定义类实现文本转换功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • WPF中NameScope的查找规则详解

    WPF中NameScope的查找规则详解

    这篇文章主要给大家介绍了关于WPF中NameScope的查找规则的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • C#解决引用类型的深度克隆问题

    C#解决引用类型的深度克隆问题

    本文将给大家介绍如何让引用类型的对象复制以后各自拥有独立的内存从而实现一个对象值的变化不会影响别的对象,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-08-08
  • C#开发Android百度地图手机应用程序(多地图展示)

    C#开发Android百度地图手机应用程序(多地图展示)

    这篇文章主要介绍了C#开发Android百度地图手机应用程序(多地图展示)的相关资料,需要的朋友可以参考下
    2016-02-02
  • C#多线程之线程控制详解

    C#多线程之线程控制详解

    这篇文章主要为大家详细介绍了C#多线程之线程控制的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • C#中字段、属性、只读、构造函数赋值、反射赋值的问题

    C#中字段、属性、只读、构造函数赋值、反射赋值的问题

    这篇文章主要介绍了C#中字段、属性、只读、构造函数赋值、反射赋值的问题 ,非常不错,具有一定的参考借鉴借鉴价值,需要的朋友可以参考下
    2018-08-08

最新评论