C# で SQL Server に 接続する 方法

0 件のコメント

C# の SqlClient を利用して Microsoft SQL Server に接続する方法をまとめます。 どちらかと言うと基本的な実装例となるようにサンプルコードを作成しました。

概要

大まかには以下のような流れで処理を行います。

  1. 接続文字列 の 準備
  2. データベース接続 準備
  3. SQLの実行

以下ではそれぞれについて具体的な方法をいくつか記載していますが、一般的に利用する方法とすれば以下のような実装が普通かと思います。 「とりあえず急ぐので結論を!」と言う方は以下の2か所だけ確認いただければ目の前の課題は乗り切れるハズ。

  1. 接続文字列 の 準備
  2. データベース接続 準備
  3. SQLの実行

接続文字列 の 準備

接続文字列の作り方は大きく3パターンあるかと思います。

ソースコード上にべた書き

一番簡単な方法です。 ソース上に埋め込まれているので外から見えないのが良い点でしょうか。 半面、ソースコードの修正をしないと接続先を変更できないのが悪い点です。 この実装を行うならせめて次に記載する ConnectionStringBuilder を利用した方法がおススメです。

1
2
3
4
5
6
7
public string GetConnectionString1()
{
    return @"Data Source=(サーバー名/IPアドレス);"
            + @"Integrated Security=False;"
            + @"User ID=(ユーザー名);"
            + @"Password=(パスワード)";
}

ConnectionStringBuilderを利用して生成

前述のべた書きとほとんど変わりませんが、プロパティへ値を設定していくものとなっているので、誤字脱字がなくせたり、プログラムとして接続先を変更したりできます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.Data.SqlClient;
 
public string GetConnectionString2()
{
    var builder = new SqlConnectionStringBuilder()
    {
        DataSource = "(サーバー名/IPアドレス)",
        IntegratedSecurity = false,
        UserID = "(ユーザー名)",
        Password = "(パスワード)"
    };
 
    return builder.ToString();
}

app.config または web.config から取得

通常はこの方法で実装されるかと思います。 テスト環境、本番環境でソースを変更せずに接続先を変更できる点が良い点です。 一方で、ユーザー名とパスワードがクリアテキストで記載されている点は悪い点になります。 リリースフローや運用でパスワード管理方法を考える必要があります。。

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

app.config または web.config

1
2
3
4
5
6
7
<configuration>
  <connectionStrings>
    <add name="sqlsvr"
         connectionString="Data Source=(サーバー名/IPアドレス);Persist Security Info=True;User ID=(ユーザー名);Password=(パスワード)"
         providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>

ソースコード

1
2
3
4
5
6
using System.Configuration;
 
public string GetConnectionString()
{
    return ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
}

データベース接続

接続を実装する方法もいくつか書き方がありますが、ここでは以下の4パターンを例として載せます。

基本の実装例

基本的な実装を見るために try-catch や using 、トランザクションといった余計なものを排除したシンプルな実装例です。 もちろんこのままではいろいろ問題があるので利用できませんが…まずは基本を理解しましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System.Configuration;
using System.Data.SqlClient;
 
public void Connect1()
{
    // 接続文字列の取得
    var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
 
    // データベース接続の準備
    var connection = new SqlConnection(connectionString);
 
    // データベースの接続開始
    connection.Open();
 
    // 実行するSQLの準備
    var command = new SqlCommand();
    command.Connection = connection;
    command.CommandText = @"SELECT count(*) FROM T_USER";
 
    // SQLの実行
    command.ExecuteNonQuery();
 
    // データベースの接続終了
    connection.Close();
}

try-catchを用いた実装例

データベース接続を行うとき、どこでエラーが起こるかわからないので try-catch を行います。 この実装例は try-catch を使ったエラーハンドリングありバージョンです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Configuration;
using System.Data.SqlClient;
 
public void Connect2()
{
    SqlConnection connection = null;
    SqlCommand command = null;
 
    // 接続文字列の取得
    var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString;
 
    try
    {
        // データベース接続の準備
        connection = new SqlConnection(connectionString);
 
        // データベースの接続開始
        connection.Open();
 
        // SQLの実行
        command = new SqlCommand()
        {
            Connection = connection,
            CommandText = @"SELECT count(*) FROM T_USER"
        };
        command.ExecuteNonQuery();
    }
    catch (Exception exception)
    {
        Console.WriteLine(exception.Message);
        throw;
    }
    finally
    {
        // データベースの接続終了
        connection.Close();
    }
 
}

using と try-catch を用いた実装例

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 に加えてトランザクション処理を行う場合の実装例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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();
        }
    }
}

SQL の 実行

SQLの実行とひとくくりにしても SELECT を実行するのと、 INSERT, UPDATE を実行するのとでは意味が違います。 ここではまとめ切れないので、また次回にします…。。

関連記事

C# を使って SQL Server に接続、操作する方法に関しては以下のような記事もあります。 あわせて参考に読んでいただけると理解が深まるハズ!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!