C#利用反射实现多数据库访问
作者:.NET开发菜鸟 发布时间:2024-01-27 12:00:58
标签: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类不需要修改,运行结果如下:
来源:https://www.cnblogs.com/dotnet261010/p/8276870.html


猜你喜欢
- PyQt5 Qt Designer (Qt设计师)PyQt5是对Qt所有类进行封装, Qt能开发的东西, PyQt都能开发.Qt是强大的GU
- 在使用过程中,一边看文档一边做,遇到了一些困难的地方,在此记录一下,顺便做个总结:1、前端分页2、后端分页3、模糊查询前端分页相当简单,在我
- 前言:MySQL 有很多存储引擎(也叫数据引擎),所谓的存储引擎是指用于存储、处理和保护数据的核心服务。也就是存储引擎是数据库的底层软件组织
- 引言Supabase是一个自称的 "开源Firebase替代品"。我对与Supbase合作已经有一段时间了,我想我将尝试
- 很多的朋友一而再,再而三的在Server.Mappath上卡壳,cnbruce也是一遍两遍地重复,还是不能全部解决,所以通过下面的举例,希望
- Keras提供了两套后端,Theano和Tensorflow,不同的后端使用时维度顺序dim_ordering会有冲突。对于一张224*22
- MyISAM和MEMORY采用表级锁(table-level locking)BDB采用页面锁(page-leve locking)或表级锁
- 一、 背景由于公司业务需要动态配置一些存储过程来生成数据,之前尝试过使用jpa来完成,或多或少都存在一些问题,最后使用了spring的Jdb
- apache对php的支持是通过apache的mod_php5模块来支持的,这点与nginx不同。nginx是通过第三方的fastcgi处理
- 既然你选择了编程作为职业,就注定了要终生以计算机为伴。但这并不意味着你应该置自己的健康不顾。谁都知道,电脑面前待久了,一是伤害你的眼睛,而是
- 如何进行 Python 性能优化,是本文探讨的主要问题。本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希
- 最近,为了能在数据库服务器中运行其他应用程序,在保持数据库操作系统版本不变的前提下对数据库服务器进行了软、硬件上的升级。在软件上,将操作系统
- sql server 锁定模式有三种:共享( S锁),更新(U锁),排他(X锁);S锁是共享锁,如果事务T对数据A加上共享锁后,则其他事务只
- 如下所示:#! /usr/bin/env python# coding=utf-8#############################
- Vue-validator 是Vue的表单验证插件,供大家参考,具体内容如下Vue版本: 1.0.24 Vue-validator版本: 2
- 二分查找法(Binary Search)是一种在有序数组中查找某一特定元素的算法,它的思想是将数组从中间分成两部分,判断目标元素在哪一部分中
- 本文实例讲述了mysql重复索引与冗余索引。分享给大家供大家参考,具体如下:重复索引:表示一个列或者顺序相同的几个列上建立的多个索引。冗余索
- 前言相信在日常生活中,平常大家聚在一起总会聊聊天,特别是女生(有冒犯到doge)非常喜欢聊星座,这个男生什么星座呀,那个男生什么星座呀…今天
- 前言以下是我对python中编写脚本最重要的库之一pyautogui的学习整理,分享给大家希望有所帮助提示:我在初步使用pyautogui的
- python 遍历字符串(含汉字)实例详解s = "中国china"for j in s: print j首