(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

2018年3月20日火曜日

【.Net Core 2.0】データベース接続文字列をappsettings.jsonに保存しプログラムから参照する方法



■データベース接続文字列をプログラムから参照できるように保存する。

○接続文字列の生成

Visual Studio 2017  ツール→データベースへの接続 から、ダイアログにしたがって、SQL Server を追加した。
すると、サーバーエクスプローラーに、追加したSQL Serverが表示される。
このプロパティーから接続文字列を拾い出した。(例)
Data Source=127.0.0.1\TESTinstance;Initial Catalog=testdb;Persist Security Info=True;User ID=sa;Password=abcdefg
(注意)
127.0.0.1\InstanceName で接続する場合、SQL Server browser を起動していなければならない。
初期状態では起動もしておらず、起動することもできない状態になっている。
コントロールパネル→管理ツール→サービス→SQL Server browser から、起動するように設定しておく。


○接続文字列情報の追加

appsettings.json の初期状態の内容を確認した。
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }

  }

}
次のように、接続文字列情報を追加した。
参照用の名前は、testDatabase とした。
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
"ConnectionStrings": {
    "testDatabase": "Data Source=127.0.0.1\TESTinstance;Initial Catalog=testdb;Persist Security Info=True;User ID=sa;Password=abcdefg;"
  }

}


■接続文字列を取得するコードを作成した。

○JSON形式の情報の読み取りに必要なパッケージの追加

NuGetで以下を追加した。

 Microsoft.Extensions.Configuration
 Microsoft.Extensions.Configuration.Json
 Microsoft.Extensions.Configuration.Binder


○取得までの流れ

IConfigurationRootのインスタンスを生成する。

このIConfigurationRootのインスタンスは、カレントディレクトリ内のappsettings.jsonを取り扱うメソッドを備えている。
たとえば、GetConnectionStringで、キーを指定して接続文字列を取得することができる。

IConfigurationRootのインスタンスは、ConfigurationBuilderインスタンス生成し設定したうえで、このBuildメソッドによって生成される。
このとき、appsettings.jsonへのパスは何らかの方法で指定しなければならない。


○appsettings.jsonへのパスを直接コードに埋め込む方法。
(実用的でない。これは動作テスト用である。)

IConfigurationRoot configuration = new ConfigurationBuilder()           .AddJsonFile(@"C:\Users\root\source\repos\WebApp_test01\WebApp_test01\appsettings.json", false)
 .Build();

string constr = configuration.GetConnectionString("testDatabase");


○appsettings.jsonへのパスを動的に取得する方法。

上の例では appsettings.json のパスが固定されているからいけない。
これを動的に指定したい。

また、共通して使えるIConfigurationRootのインスタンスは、プログラム起動時に一回だけ生成しておき、
後でいつでも参照できるようにしたい。

先ず、次のように、Programクラスに、staticメンバ(IConfigurationRoot configuration)を追加して、
Mainメソッド内でConfigurationBuilderによって生成したIConfigurationRootのインスタンスの参照を保存するようにする。
public class Program
    {
        public static IConfigurationRoot configuration;
        public static void Main(string[] args)
        {
         
            configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(@"appsettings.json", false).Build();       
            BuildWebHost(args).Run();
        }
        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
<略>
次に、appsettings.jsonを参照するには、次のように、
さきのProgramクラスを指定しその静的メンバであるconfigurationを参照することで、
先ほどのIConfigurationRootのインスタンスがもつアクセス用メソッドを呼び出す。
    public class MyRepository
    {
        public SqlConnection con; //using System.Data.SqlClient;
        private void connection()
        {
            string constr = Program.configuration.GetConnectionString("testDatabase");

            con = new SqlConnection(constr);
        }
<略>

以上


NuGet
System.Data.Common
System.Data.SqlClient


ASP.NET MVCプログラミング入門 (マイクロソフト関連書)

新品価格
¥3,456から
(2018/5/21 15:43時点)


<参考>

・I cannot start SQL Server browser
< https://stackoverflow.com/questions/21375014/i-cannot-start-sql-server-browser > 2018年3月17日

▲json形式ファイルに保存された接続文字列情報

・Configure an ASP.NET Core App / JSON configuration
< https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?tabs=basicconfiguration > 2018年3月20日

・Connection Strings/ASP.NET Core
< https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-strings#aspnet-core > 2018年3月17日

・.NET Core のコンソ-ルアプリケーションで設定ファイルを利用する
< https://qiita.com/abpla/items/c4faeed42bef4d450c8d >2018年3月18日

・Using .NET Core Configuration with legacy projects
< http://benfoster.io/blog/net-core-configuration-legacy-projects > 2018年3月18日