.net core獲取數據庫連接 拋出The type initializer to throw an exception

       原文:https://www.cnblogs.com/pudefu/p/7580722.html

  在.NET Framework框架時代我們的應用配置內容一般都是寫在Web.config或者App.config文件中,讀取這兩個配置文件只需要引用System.Configuration程序集,分別用

System.Configuration.ConfigurationManager.AppSettings["SystemName"];//讀取appSettings配置
System.Configuration.ConfigurationManager.ConnectionStrings["DBConnectionStr"];//讀取connectionStrings配置

讀取配置文件和數據庫鏈接。

  

  現在我們終於迎來.NET Core時代,越來越多的應用被遷移至.NET Core框架下,.NET Core2.0發佈以後,.NET Core更加成熟了,原本在.NET Framework框纔有的類庫.NET Core也基本全部實現,並有增強。因此小菜我也已經準備好加入.NET Core大軍中,所以小菜我最近開始修煉.NET Core大法。

  

  欲鑄劍,必先打鐵,我要一步步來,讀取配置文件是一個應用中必不可少的,先弄清怎麼讀取配置文件,.NET Core配置文件爲appsettings.json,爲了滿足在各個不同類中都能便捷的讀取appsettings.json中的配置,所以我需要將讀取appsettings.json封裝到類庫中。在Startup中讀取就不說了,在類庫中實現讀取怎麼玩兒?直接上代碼,appsettings.json文件內容如下:

複製代碼
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "CxyOrder": "Server=LAPTOP-AQUL6MDE\\MSSQLSERVERS;Database=CxyOrder;User ID=sa;Password=123456;Trusted_Connection=False;"
  },
  "Appsettings": {
    "SystemName": "PDF .NET CORE",
    "Date": "2017-07-23",
    "Author": "PDF"
  },
  "ServiceUrl": "https://www.baidu.com/getnews"
}
複製代碼

 

建一個項目名稱爲NetCoreOrder.Common的類庫項目,並給該類庫項目引入 Microsoft.Extensions.Configuration 和 Microsoft.Extensions.Configuration.Json程序包,類庫中加載appsettings.json配置文件代碼如下:

複製代碼
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;

namespace NetCoreOrder.Common
{
    /// <summary>
    /// 讀取配置文件
    /// </summary>
    public class AppConfigurtaionServices
    {
        public static IConfiguration Configuration { get; set; }
        static AppConfigurtaionServices()
        {
            //ReloadOnChange = true 當appsettings.json被修改時重新加載            
            Configuration = new ConfigurationBuilder()
              .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
              .Build();            
        }
    }
}
複製代碼

 

讀取配置文件的代碼完成了,只要引用了NetCoreOrder.Common類庫的項目中都能方便讀取數據庫鏈接字符串和其他配置,使用方法如下:

AppConfigurtaionServices.Configuration.GetConnectionString("CxyOrder"); 
//得到 Server=LAPTOP-AQUL6MDE\\MSSQLSERVERS;Database=CxyOrder;User ID=sa;Password=123456;Trusted_Connection=False;

 

讀取一級配置節點配置

AppConfigurtaionServices.Configuration["ServiceUrl"];
//得到 https://www.baidu.com/getnews

 

讀取二級子節點配置

AppConfigurtaionServices.Configuration["Appsettings:SystemName"];
//得到 PDF .NET CORE
AppConfigurtaionServices.Configuration["Appsettings:Author"];
//得到 PDF

 

  注意,如果AppConfigurtaionServices類中拋出FileNotFoundException異常,說明目錄下未找到appsettings.json文件,這時請在項目appsettings.json文件上右鍵——屬性——將“複製到輸出目錄”項的值改爲“始終複製”即可

 

紅色標註這個需要格外注意,我在獲取完團隊項目後,程序運行登錄異常,

 connectionString 獲取失敗,這是個封裝的方法,我們追蹤進去

轉到PubConstant.ConnectionString的靜態方法中去

加上try catch 捕獲異常,發現在獲取配置文件的時候出現錯誤。

 

 這樣就說明Appsettings.json文件沒有找到,但是項目中我們是可以看到的確是存在的

而程序在運行的時候沒有找到,說明程序在編譯後運行時的bin目錄文件夾下沒有該文件,說明程序編譯的時候沒有生成該文件,導致找不到引發異常。

所以需要修改該文件的屬性。

如果選擇始終複製:則每次編譯都會複製會在該程序集的bin目錄下生成該文件

或選擇較新則複製:則每次編譯都會對比兩個文件,不同纔會複製到該目錄文件,即即使你手動修改了bin目錄的這個文件,但是程序編譯的時候,它還是會因爲文件存在差異,而複製把bin文件下的給覆蓋掉,儘管bin目錄下的是新版本。

不過一般我們都是選擇始終複製,畢竟我們都是修改項目文件,然後讓編譯器去編譯生成發佈文件。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章