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

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(文字列「<source」を「<syntaxhighlight」に置換)
(文字列「</source>」を「</syntaxhighlight>」に置換)
42行目: 42行目:
     return builder.ToString();
     return builder.ToString();
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== app.configまたはweb.configから取得する方法 =====
===== app.configまたはweb.configから取得する方法 =====
58行目: 58行目:
     return ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
     return ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
  }
  }
  </source>
  </syntaxhighlight>
  <syntaxhighlight lang="xml">
  <syntaxhighlight lang="xml">
  <!-- app.configまたはweb.config -->
  <!-- app.configまたはweb.config -->
72行目: 72行目:
   </connectionStrings>
   </connectionStrings>
  </configuration>
  </configuration>
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


117行目: 117行目:
     }
     }
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
===== トランザクションを用いる方法 =====
===== トランザクションを用いる方法 =====
176行目: 176行目:
     }
     }
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


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

2021年11月18日 (木) 06:13時点における版

概要

ADO.NETを用いてC\#でSQL Serverに接続するには、下記のような流れで処理を行う。

  1. 接続文字列の準備(コード埋め込みまたはapp.configから取得)
  2. データベース接続準備(usingとtry-catchを用いた実装例)
  3. SQLの実行


  • 備考1
Initial CatalogをTrueにすると、SQL Server Expressだとmdfファイルへの接続のみ許可されて、接続ユーザ毎に新しいプロセスが立ち上がる。
開発時にはTrueで問題ないが、本番環境ではセキュリティ的な問題でFalseにすること。

  • 備考2
データソースの指定は下記の表を参照すること。ポート番号は省略できる。
例えば、ローカルのSQL Server Expressのインスタンス名SQLEXPRESSに接続する場合には、下記のように指定すればよい。
Data Source=.\SQLEXPRESS;...
既定のインスタンス (コンピュータ名、サーバアドレス),(ポート番号)
名前付きインスタンス (コンピュータ名、サーバアドレス)\(インスタンス名),(ポート番号)


接続文字列の準備

ソースコード上に埋め込む方法

プロパティ値を設定するので、ソースコード上で接続先が変更できる。

 using System.Data.SqlClient;
 
 public string GetConnectionString2()
 {
    var builder = new SqlConnectionStringBuilder()
    {
        DataSource         = "サーバー名/IPアドレス",
        InitialCatalog     ="データベース名",
        IntegratedSecurity = false, // SQL Server認証なら不要
        UserID             = "ユーザー名",
        Password           = "パスワード"
    };
 
    return builder.ToString();
 }


app.configまたはweb.configから取得する方法

テスト環境、本番環境でソースコードを変更せずに接続先を変更することができる。
ただし、ユーザ名とパスワードを平文で記載する場合は、リリースフローや運用でパスワード管理方法を考える必要がある。

app.configまたはweb.configのadd[@name]で指定された名前は、接続文字列を取得する際のキーになる。
ソースコード上でこのキーを指定することで接続文字列を取得する。
ここでは"sqlsvr"を利用しているが、特定できれば任意の文字列で問題ない。

 
 using System.Configuration;
 
 public string GetConnectionString()
 {
     return ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
 }
 <!-- app.configまたはweb.config -->
 <configuration>
   <connectionStrings>
     <add name="sqlsvr"  // 接続文字列
         connectionString="Data Source=(サーバー名/IPアドレス);
         Initial Catalog=(データベース名); // SQL Server認証なら不要
         Persist Security Info=True;
         User ID=(ユーザー名);
         Password=(パスワード)"
         providerName="System.Data.SqlClient"/>
   </connectionStrings>
 </configuration>



データベース接続

SQL Serverに接続する実装方法はいくつ存在するが、ここでは以下のパターンを記載する。

  • usingとtry-catchを用いる方法
  • トランザクションを用いる方法


usingとtry-catchを用いる方法

一部のオブジェクトは破棄を保証する必要があるので、ソースコードに記載するのではなく、usingで担保するような実装を行う。
スコープから外れた時点で破棄が必要なオブジェクトは自動的に破棄されるが、 usingを用いるとオブジェクトの破棄が明示的になる。

 using System;
 using System.Configuration;
 using System.Data.SqlClient;
 
 public void Connect3()
 {
    // 接続文字列の取得
    var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
 
    using (var connection = new SqlConnection(connectionString))
    using (var command = connection.CreateCommand())
    {
        try
        {
            // データベースの接続開始
            connection.Open();
 
            // SQLの実行
            command.CommandText = @"SELECT count(*) FROM T_USER";
            command.ExecuteNonQuery();
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
            throw;
        }
        finally
        {
            // データベースの接続終了
            connection.Close();
        }
    }
 }


トランザクションを用いる方法

上記のusingとtry-catchに加えて、トランザクション処理を行う場合の実装例である。

 using System;
 using System.Configuration;
 using System.Data.SqlClient;
 
 public void Create(string id, string password)
 {
    // 接続文字列の取得
    var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
 
    using (var connection = new SqlConnection(connectionString))
    {
        try
        {
            // データベースの接続開始
            connection.Open();
 
            using (var transaction = connection.BeginTransaction())
            using (var command = new SqlCommand() { Connection = connection, Transaction = transaction })
            {
                try
                {
                    // 実行するSQLの準備
                    command.CommandText = @"INSERT INTO T_USER (ID, PASSWORD) VALUES (@ID, @PASSWORD)";
                    command.Parameters.Add(new SqlParameter("@ID", id));
                    command.Parameters.Add(new SqlParameter("@PASSWORD", password));
 
                    // SQLの実行
                    command.ExecuteNonQuery();
                }
                catch
                {
                    // ロールバック
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    // コミット
                    transaction.Commit();
                }
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
            throw;
        }
        finally
        {
            // データベースの接続終了
            connection.Close();
        }
    }
 }