返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#利用反射实现多数据库访问
  • 950
分享到

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

2024-04-02 19:04:59 950人浏览 泡泡鱼
摘要

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

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

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

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#利用反射实现多数据库访问的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#利用反射实现多数据库访问

本文链接: https://lsjlt.com/news/141541.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#利用反射实现多数据库访问
    在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。 项目整...
    99+
    2024-04-02
  • C#使用ADO.Net连接数据库与DbProviderFactory实现多数据库访问
    一、ADO.Net数据库连接字符串 1、OdbcConnection(System.Data.Odbc) (1)SQL Sever 标准安全:" Driver={SQL S...
    99+
    2024-04-02
  • C#怎么使用ADO.Net连接数据库与实现多数据库访问
    本文小编为大家详细介绍“C#怎么使用ADO.Net连接数据库与实现多数据库访问”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么使用ADO.Net连接数据库与实现多数据库访问”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-30
  • 怎么利用C++实现一个反射类
    这篇文章主要讲解了“怎么利用C++实现一个反射类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么利用C++实现一个反射类”吧!代码环境为VScode + CMake + GCC 8.1.0...
    99+
    2023-07-05
  • C# 中怎么利用ODBC访问MySQL数据库
    C# 中怎么利用ODBC访问MySQL数据库,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。安装Microsoft ODBC.net:我安装的是mysql-con...
    99+
    2023-06-17
  • 详解如何利用C++实现一个反射类
    目录正题开始Singleton.h反射类Reflex.h代码环境为VScode + CMake + GCC 8.1.0 首先,如何才能做到给我一个名字我就能拿到这个对象的这个值,也是...
    99+
    2023-03-09
    C++实现反射类 C++反射类
  • Asp.netcore利用dynamic简化数据库访问
    今天写了一个数据库的帮助类,代码如下。  public static class DbEx { public static dynamic ReadToObject...
    99+
    2024-04-02
  • JavaScript中怎么利用DOM实现数据访问
    本篇文章给大家分享的是有关JavaScript中怎么利用DOM实现数据访问,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。通过JavaScrip...
    99+
    2024-04-02
  • C++使用MySQL Connector/C++访问mysql数据库
    去官网下载,分为release模式和debug模式两种,分别对应VS中的release和debug。如下图所示: 注意: 如果使用debug模式,下载的上面的release模式库文件,那么编译就会出...
    99+
    2023-09-05
    数据库 mysql c++
  • 如何利用VB.NET数据库访问方法封装到类实现
    这期内容当中小编将会给大家带来有关如何利用VB.NET数据库访问方法封装到类实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我们都知道,线程要执行的方法不能接受任何参数,如果要传入方法特定条件,可以将方...
    99+
    2023-06-17
  • C#如何实现数据访问XML
    这篇文章给大家分享的是有关C#如何实现数据访问XML的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在举C#数据访问XML的例子之前,首先介绍一些知识和定义。XML DOM的类所在的命名空间为System.Xml中...
    99+
    2023-06-17
  • Java利用套接字实现应用程序对数据库的访问
    目录前言Client.javaServer.javaServerThread.javaSearchInfo.javaGUI.java前言 最近在完成软件体系结构上机实验时,遇到一个有...
    99+
    2024-04-02
  • c#怎么访问mysql数据库
    要访问MySQL数据库,可以使用MySQL官方提供的MySQL Connector/Net库。以下是使用C#连接MySQL数据库的一...
    99+
    2024-04-18
    c# mysql
  • c++怎么访问mysql数据库
    在C++中访问MySQL数据库通常需要使用MySQL官方提供的MySQL C API。以下是一些基本步骤来访问MySQL数据库: ...
    99+
    2024-04-18
    c++ mysql
  • Holer实现MongoDB数据库外网访问
    外网访问内网MongoDB数据库 内网主机上安装了MongoDB数据库,只能在局域网内访问,怎样从公网也能访问本地MongoDB数据库? 本文将介绍使用holer实现的具体步骤。 1. 准备工...
    99+
    2024-04-02
  • Holer实现外网访问PostgreSQL数据库
    外网访问内网PostgreSQL数据库 内网主机上安装了PostgreSQL数据库,只能在局域网内访问,怎样从公网也能访问本地PostgreSQL数据库? 本文将介绍使用holer实现的具体步骤。...
    99+
    2024-04-02
  • golang函数利用反射实现面向切面的编程
    答案:是的,go 语言中的反射可以实现面向切面的编程。详细描述:反射允许程序在运行时修改和检查自己的类型和值。通过反射,我们可以为代码创建全局切面,在函数执行前、后触发。这使我们能够轻松...
    99+
    2024-04-25
    反射 面向切面编程 golang 代码可读性
  • 利用Golang反射实现动态类型处理
    反射是 go 的一项功能,用于在运行时检查和修改类型,可用于动态类型处理。具体步骤包括:获取类型对象(reflect.type)、获取类型信息(名称、种类)、获取值反射值(reflect...
    99+
    2024-04-03
    golang
  • C++ 函数调用反射技术:参数传递和返回值的动态访问
    c++++ 函数调用反射技术允许在运行时动态获取函数的参数和返回值信息。使用 typeid(decltype(...)) 和 decltype(...) 表达式可获取参数和返回值类型信息...
    99+
    2024-05-05
    函数调用 反射技术 c++
  • Java中怎么利用JDBC和DBCP访问数据库
    本篇文章为大家展示了Java中怎么利用JDBC和DBCP访问数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JDBC:Connection conn&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作