「C Sharpとデータベース - データベースの接続」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

編集の要約なし
 
(2人の利用者による、間の8版が非表示)
23行目: 23行目:
<br>
<br>


== 接続文字列の準備 ==
== 接続文字列の設定 ==
* ソースコード上に埋め込む
===== ソースコード上に埋め込む方法 =====
:プロパティ値を設定するので、ソースコード上で接続先が変更できる。
プロパティ値を設定して、ソースコード上で接続先を変更する。<br>
 
ただし、動的な切り替えができないため本番環境では使用すべきではない。<br>
<br>
<syntaxhighlight lang="c#">
  using System.Data.SqlClient;
  using System.Data.SqlClient;
   
   
42行目: 44行目:
     return builder.ToString();
     return builder.ToString();
  }
  }
</syntaxhighlight>
<br>
===== アプリケーション構成ファイル (app.config / web.config) から取得する方法 =====
app.config / web.configは、アプリケーション構成ファイルとも呼ばれている。<br>
これは、Microsoft .NET標準の設定値の保存場所である。<br>
<br>
アプリケーション構成ファイルのメリット<br>
* 接続情報をソースコードから分離できる。
* 環境ごとに設定が変更できる。
*: 例えば、環境別 (開発環境、テスト環境、本番環境) ごとに接続文字列を設定できる。
* パスワードの暗号化も可能である。
<br>
app.config / web.configは通称であり、実際には<アプリケーション名>.exe.Configという名前の場合が多い。<br>
一般的に、実行ファイルと同階層に生成されるが、設定によっては一部ユーザフォルダに配置されることもある。<br>
<br>
app.configには2種類のクラス (PropertiesおよびConfiguration) が用意されており、それぞれ役割とスコープを持つ。<br>
<br>
app.config / web.configの<code>connectionStrings</code>タグは、C#でデータベース接続文字列を管理するための重要な設定セクションである。<br>
ただし、ユーザ名とパスワードを平文で記述する場合は、リリース時や運用でパスワード管理方法を考える必要がある。<br>
<br>
app.config / web.configのadd[@name]で指定された名前は、接続文字列を取得する時のキーになる。<br>
ソースコード上でこのキーを指定することで接続文字列を取得する。<br>
<br>
* name
*: 接続文字列の識別子
* connectionString
*: 実際の接続文字列
* providerName
*: 使用するデータプロバイダ
<br>
<u>※注意</u><br>
<u>パスワードは平文で保存せずに暗号化することを推奨する。</u><br>
<br>
<syntaxhighlight lang="xml">
<?xml version="1.0" encoding="utf-8" ?>
<!-- app.configまたはweb.config -->
<configuration>
  <connectionStrings>
    <!-- SQL Server (通常) - SQL Server認証 -->
    <!-- SQL Server認証の場合はUser IDとPasswordを指定 -->
    <add name="<任意の接続文字列>"
          connectionString="Data Source=<サーバ名 / IPアドレス>;
          Initial Catalog=<データベース名  ※ただし、SQL Server認証なら不要>;
          Persist Security Info=True;
          User ID=<DBユーザ名>;
          Password=<DBユーザのパスワード>"
          providerName="System.Data.SqlClient"/>
    <!-- SQL Server (通常) - Windows認証 -->
    <!-- Windows認証の場合はIntegrated Security=Trueを指定 -->
    <add name="<任意の接続文字列>"
          connectionString="Data Source=<サーバ名 / IPアドレス>;
          Initial Catalog=<データベース名>;
          Integrated Security=True"
          providerName="System.Data.SqlClient"/>
    <!-- SQL Server (LocalDB) -->
    <add name="<任意の接続文字列>"
          connectionString="Data Source=(LocalDB)\MSSQLLocalDB;
          Initial Catalog=<データベース名>;
          Integrated Security=True"
          providerName="System.Data.SqlClient"/>
    <!-- MySQL -->
    <!-- NuGetでMySql.Dataパッケージのインストール -->
    <!-- Uidでユーザ名、Pwdでパスワードを指定 -->
    <!-- ServerをData Sourceに変更してもよい -->
    <add name="MySQLConnection"
          connectionString="Server=<サーバ名 / IPアドレス>;
          Database=<データベース名>;
          Uid=<DBユーザ名>;
          Pwd=<DBユーザのパスワード>"
          providerName="MySql.Data.MySqlClient"/>


* app.configまたはweb.configから取得
    <!-- SQLite 3 -->
:テスト環境、本番環境でソースコードを変更せずに接続先を変更することができる。
    <!-- NuGetでSystem.Data.SQLiteパッケージのインストール -->
:ただし、ユーザ名とパスワードを平文で記載する場合は、リリースフローや運用でパスワード管理方法を考える必要がある。
    <!-- ファイルベースのDBなので、Data SourceにDBファイルのパスを指定 -->
 
    <!-- |DataDirectory|はアプリケーションのデータディレクトリを示す特殊なプレースホルダ (省略可能) -->
:app.configまたはweb.configのadd[@name]で指定された名前は、接続文字列を取得する際のキーになる。
    <!-- デスクトップアプリケーションの場合、既定では実行可能ファイルのディレクトリを指す -->
:ソースコード上でこのキーを指定することで接続文字列を取得する。
    <!-- Webアプリケーションの場合、App_Dataディレクトリを指す -->
:ここでは'''"sqlsvr"'''を利用しているが、特定できれば任意の文字列で問題ない。
    <add name="SQLiteConnection"
 
          connectionString="Data Source=|DataDirectory|<SQLiteファイルのパス>.db;
'''---ソースコード---'''
          Version=3;"
          providerName="System.Data.SQLite"/>
    <!-- Oracle -->
    <!-- NuGetでOracle.ManagedDataAccessパッケージのインストール -->
    <add name="OracleConnection"
          connectionString="Data Source=<TNS名>;
          User Id=<DBユーザ名>;
          Password=<DBユーザのパスワード>;"
          providerName="Oracle.ManagedDataAccess.Client"/>
  </connectionStrings>
</configuration>
</syntaxhighlight>
<br>
SQLiteを使用する場合、Data Sourceの|DataDirectory|は、変更することができる。<br>
<br>
<syntaxhighlight lang="c#">
AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data"));
</syntaxhighlight>
<br>
<syntaxhighlight lang="c#">
// 接続文字列の取得と接続
  using System.Configuration;
  using System.Configuration;
   
   
  public string GetConnectionString()
  public string GetConnectionString()
  {
  {
     return ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
     return ConfigurationManager.ConnectionStrings["<addタグのname属性の値>"].ConnectionString;
  }
  }
   
   
  '''---app.configまたはweb.config---'''
  // データベースへ接続
  <configuration>
  public string Connect()
  <connectionStrings>
  {
    <add name="sqlsvr" // 接続文字列
    var connectionString = GetConnectionString();
        connectionString="Data Source=(サーバー名/IPアドレス);
    using (var connection = new SqlConnection(connectionString))
        Initial Catalog=(データベース名); // SQL Server認証なら不要
    {
        Persist Security Info=True;
      connection.Open();
        User ID=(ユーザー名);
        Password=(パスワード)"
      // ...
        providerName="System.Data.SqlClient"/>
    }
  </connectionStrings>
}
</configuration>
</syntaxhighlight>
 
<br>
<br><br>


== データベース接続 ==
== データベース接続 ==
SQL Serverに接続する実装方法はいくつ存在するが、ここでは以下のパターンを記載する。<br>
SQL Serverに接続する実装方法はいくつ存在するが、ここでは以下のパターンを記載する。<br>
# usingとtry-catchを用いた実装例
* usingとtry-catchを用いる方法
# トランザクションを用いた実装例
* トランザクションを用いる方法
<br>
<br>
* usingとtry-catchを用いた実装例
===== usingとtry-catchを用いる方法 =====
:一部のオブジェクトは破棄を保証する必要があるので、ソースコードに記載するのではなく、usingで担保するような実装を行う。
一部のオブジェクトは破棄を保証する必要があるので、ソースコードに記載するのではなく、usingで担保するような実装を行う。<br>
:スコープから外れた時点で破棄が必要なオブジェクトは自動的に破棄されるが、 usingを用いるとオブジェクトの破棄が明示的になる。
スコープから外れた時点で破棄が必要なオブジェクトは自動的に破棄されるが、 usingを用いるとオブジェクトの破棄が明示的になる。<br>
 
<syntaxhighlight lang="c#">
  using System;
  using System;
  using System.Configuration;
  using System.Configuration;
115行目: 214行目:
     }
     }
  }
  }
 
</syntaxhighlight>
 
<br>
* トランザクションを用いた実装例
===== トランザクションを用いる方法 =====
:上記のusingとtry-catchに加えて、トランザクション処理を行う場合の実装例である。
上記のusingとtry-catchに加えて、トランザクション処理を行う場合の実装例である。<br>
<syntaxhighlight lang="c#">
  using System;
  using System;
  using System.Configuration;
  using System.Configuration;
173行目: 273行目:
     }
     }
  }
  }
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
[[カテゴリ:C_Sharp]]
[[カテゴリ:C_Sharp]]