最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#利用反射實(shí)現(xiàn)多數(shù)據(jù)庫訪問

 更新時(shí)間:2022年03月07日 11:12:34   作者:.NET開發(fā)菜鳥  
本文詳細(xì)講解了C#利用反射實(shí)現(xiàn)多數(shù)據(jù)庫訪問的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

上一篇文章中講解了什么是反射,以及利用反射可以獲取程序集里面的哪些內(nèi)容。在平時(shí)的項(xiàng)目中,可能會(huì)遇到項(xiàng)目需要使用多種數(shù)據(jù)庫,這篇文章中將會(huì)講解如何利用反射實(shí)現(xiàn)訪問多種數(shù)據(jù)庫。

項(xiàng)目整體結(jié)構(gòu)如下圖所示:

1、Database.Instance是一個(gè)類庫文件,IDBHelper是一個(gè)接口,封裝的訪問數(shù)據(jù)庫數(shù)據(jù)的CURD方法,OracleDBHelper和SQLServerDBHelper類實(shí)現(xiàn)IDBHelper接口,分別用來訪問Oracle數(shù)據(jù)庫和SQL Server數(shù)據(jù)庫,接口和類的定義如下:

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>
        /// 創(chuàng)建數(shù)據(jù)
        /// </summary>
        void Create();

        /// <summary>
        /// 更新數(shù)據(jù)
        /// </summary>
        void Update();

        /// <summary>
        /// 讀取數(shù)據(jù)
        /// </summary>
        void Retrieve();

        /// <summary>
        /// 刪除數(shù)據(jù)
        /// </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數(shù)據(jù)庫執(zhí)行創(chuàng)建操作");
        }

        public void Update()
        {
            Console.WriteLine("這是Oracle數(shù)據(jù)庫執(zhí)行更新操作");
        }

        public void Retrieve()
        {
            Console.WriteLine("這是Oracle數(shù)據(jù)庫執(zhí)行讀取操作");
        }

        public void Delete()
        {
            Console.WriteLine("這是Oracle數(shù)據(jù)庫執(zhí)行刪除操作");
        }
    }
}

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數(shù)據(jù)庫執(zhí)行創(chuàng)建操作");
        }

        public void Update()
        {
            Console.WriteLine("這是SQL Server數(shù)據(jù)庫執(zhí)行更新操作");
        }

        public void Retrieve()
        {
            Console.WriteLine("這是SQL Server數(shù)據(jù)庫執(zhí)行讀取操作");
        }

        public void Delete()
        {
            Console.WriteLine("這是SQL Server數(shù)據(jù)庫執(zhí)行刪除操作");
        }
    }
}

2、MyReflection是一個(gè)控制臺(tái)程序,用來測(cè)試

一、使用原始方法實(shí)現(xiàn)

使用原始的方法實(shí)現(xiàn)代碼如下:

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)
        {
            // 實(shí)例化(調(diào)用Oracle數(shù)據(jù)庫)
            IDBHelper dbHelper = new OracleDBHelper();
            // 調(diào)用方法
            dbHelper.Create();
            dbHelper.Update();
            dbHelper.Retrieve();
            dbHelper.Delete();

            Console.ReadKey();
        }
    }
}

程序運(yùn)行結(jié)果:

存在的問題:如果換一種數(shù)據(jù)庫,那么就需要修改實(shí)例化的代碼,例如更換SQL Server數(shù)據(jù)庫,那么代碼修改如下:

IDBHelper dbHelper = new SQLServerDBHelper();

這樣很不方便,每次更換數(shù)據(jù)庫的時(shí)候,都需要修改實(shí)例化的代碼,有沒有什么方便的方法可以做到不需要修改代碼就可以實(shí)現(xiàn)更換數(shù)據(jù)庫呢?辦法就是使用反射加配置文件實(shí)現(xiàn)。

二、使用反射加配置文件實(shí)現(xiàn)

配置文件結(jié)構(gòu)如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!--key表示定義的接口 value格式 要加載的程序集名稱,要實(shí)例化的類 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)
        {
            // 根據(jù)key值讀取對(duì)應(yīng)的value值
            string[] config = ConfigurationManager.AppSettings["Database.Instance.Interface.IDBHelper"].Split(',');
            // 加載程序集 config[0]=Database.Instance
            Assembly assembly = Assembly.Load(config[0]);

            // 根據(jù)類的完全限定名找出類型 config[1]= Database.Instance.Oracle.OracleDBHelper
            Type type = assembly.GetType(config[1]);
            // 根據(jù)類型創(chuàng)建對(duì)象
            object obj = Activator.CreateInstance(type);
            //實(shí)例化
            IDBHelper dbHelper = obj as IDBHelper;
            dbHelper.Create();
            dbHelper.Update();
            dbHelper.Retrieve();
            dbHelper.Delete();
            Console.ReadKey();
        }
    }
}

 運(yùn)行結(jié)果如下:

如果更新數(shù)據(jù)庫,只需要更新配置文件中value的值即可,例如要更換SQL Server數(shù)據(jù)庫,配置文件修改如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!--key表示定義的接口 value格式 要加載的程序集名稱,要實(shí)例化的類 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類不需要修改,運(yùn)行結(jié)果如下:

到此這篇關(guān)于C#利用反射實(shí)現(xiàn)多數(shù)據(jù)庫訪問的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#使用正則表達(dá)式過濾html標(biāo)簽

    C#使用正則表達(dá)式過濾html標(biāo)簽

    最近在開發(fā)一個(gè)項(xiàng)目,其中有需求要求我們把一段html轉(zhuǎn)換為一般文本返回,使用正則表達(dá)式是明智的選擇,下面小編給介紹下C#使用正則表達(dá)式過濾html標(biāo)簽,需要的朋友參考下
    2016-08-08
  • C#實(shí)現(xiàn)按數(shù)據(jù)庫郵件列表發(fā)送郵件的方法

    C#實(shí)現(xiàn)按數(shù)據(jù)庫郵件列表發(fā)送郵件的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)按數(shù)據(jù)庫郵件列表發(fā)送郵件的方法,涉及C#讀取數(shù)據(jù)庫及通過自定義函數(shù)發(fā)送郵件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • WPF綁定實(shí)例詳解

    WPF綁定實(shí)例詳解

    這篇文章主要介紹了WPF綁定的用法,包括了WPF綁定控件及非控件對(duì)象的用法,以及各類參數(shù)的詳細(xì)用法,需要的朋友可以參考下
    2014-09-09
  • C# web應(yīng)用程序不能訪問app_code下類的原因以及解決方法

    C# web應(yīng)用程序不能訪問app_code下類的原因以及解決方法

    本文主要介紹了C#web應(yīng)用程序不能訪問app_code下類的原因以及解決方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法

    C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法,基于自定義類實(shí)現(xiàn)文本轉(zhuǎn)換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • WPF中NameScope的查找規(guī)則詳解

    WPF中NameScope的查找規(guī)則詳解

    這篇文章主要給大家介紹了關(guān)于WPF中NameScope的查找規(guī)則的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • C#解決引用類型的深度克隆問題

    C#解決引用類型的深度克隆問題

    本文將給大家介紹如何讓引用類型的對(duì)象復(fù)制以后各自擁有獨(dú)立的內(nèi)存從而實(shí)現(xiàn)一個(gè)對(duì)象值的變化不會(huì)影響別的對(duì)象,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • C#開發(fā)Android百度地圖手機(jī)應(yīng)用程序(多地圖展示)

    C#開發(fā)Android百度地圖手機(jī)應(yīng)用程序(多地圖展示)

    這篇文章主要介紹了C#開發(fā)Android百度地圖手機(jī)應(yīng)用程序(多地圖展示)的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • C#多線程之線程控制詳解

    C#多線程之線程控制詳解

    這篇文章主要為大家詳細(xì)介紹了C#多線程之線程控制的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的問題

    C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的問題

    這篇文章主要介紹了C#中字段、屬性、只讀、構(gòu)造函數(shù)賦值、反射賦值的問題 ,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08

最新評(píng)論

娱乐| 泸定县| 遵义市| 南昌县| 崇信县| 新余市| 重庆市| 沁水县| 屏东县| 正镶白旗| 黄冈市| 香格里拉县| 兰州市| 共和县| 鄂伦春自治旗| 苏尼特左旗| 黄山市| 巴林右旗| 江山市| 广丰县| 枞阳县| 库车县| 天等县| 虎林市| 广宗县| 昌宁县| 衡山县| 张家港市| 梅河口市| 大同县| 新丰县| 庐江县| 扎囊县| 大冶市| 梨树县| 永川市| 新巴尔虎右旗| 颍上县| 元阳县| 咸宁市| 灵台县|