近ため公式Twitterはこちら

【C#&SQLServer】データベースと接続フォーム作成する

スポンサーリンク
C#名刺管理アプリ (2) C#

C#で名刺アプリを作成する手順を解説するシリーズ、第2回目です。この記事では、名刺データを保管するデータベースの作成データベースにデータを挿入するメソッドを備えたクラス、そしてDB接続フォームを作成したいと思います。

では、早速はじめていきましょう。今回はコーディングをするので、難しく感じるかもしれませんが、かなり丁寧に説明していくので、ご安心ください。(分からない所があれば、@kintame_contactか記事のコメント欄にお願いします。)

目次はこちらです。

SQLServerにデータベースを作成

SQLServerにデータベースを作成する手順を解説します。まだ、SQLServerをインストールされていない方は先にインストールしてください。

※データベースをちょっとだけ解説

データベースを作成する前に知っておきたい知識を軽く解説しておきます。

データベースの構造

データベースは言わば、上の画像のような構造をしています。「データベース」の中に「テーブル」があり、テーブルの上から順に、「レコード」が挿入されていきます。テーブルのデータ1つひとつを「フィールド」といいます。

特に、重要なことは「データベース」の中に「テーブル」があるということです。

テーブルの具体例※参考に、今回作成するテーブルを記載しておきました。

データベース作成

準備が出来たら、SQLServerを開きましょう。PCの検索欄に「SQL Server Management Studio」と入力するとアプリが起動できます。

ssms

起動出来ると真っ黒なフォームが開き、しばらく待つと下の画像のように「サーバーへの接続」フォームが表示されるので、「接続」をクリックします。

SQLServer起動時の画面


接続出来たら、画面左側のオブジェクトエクスプローラーにある、「📁データベース」を右クリックし、「新しいデータベース(N)…」をクリックします。

データベースを右クリック

下のようなウィンドウが開くので、データベース名(N)に「Cards_DB」と入力してOKをクリック。

新しいデータベースを追加

これでデータベースの作成は完了です。続いてデータを保管するテーブルを作成していきましょう。

テーブルの作成

Cards_DBの+マークを押し、テーブルを右クリック→新規作成(N)→テーブル(T)…を押します。

テーブルの作成テーブルの列名とデータ型を以下のように設定します。idには主キーを設定します。idを右クリックして「主キーの設定(Y)」

テーブルの列を作成間違いなく設定出来れば、「Ctrl+S」で保存します。すると、テーブル名を入力するウィンドウが表示されるので、「Cards_Table」としてください。

テーブルを保存

ユーザーの作成(※SQLServer認証のみ)

続いて、ユーザーを作成します。SQLServerにはログインユーザーとデータベースユーザーの2種類があります。これはSQLServerならではの仕様です。詳細は下の記事で解説しているため、省略しますが、「ログインユーザー」「データベースユーザー」の2つのユーザーを作成しなければならないということを覚えておいてください。

▼SQLServerのユーザー設定はこちら▼

ログインユーザーの作成
(PC名\SQLEXPRESS)の「📁セキュリティ」→「📁ログイン」を右クリックし、新しいログイン(N)…をクリックします。

新しいログインユーザーの作成

ログインユーザーの作成ウィンドウが表示されます。ログイン名「test」、SQL Server認証に切り替え、パスワード「test」と入力しておきます。今回は「パスワードポリシーを適用する」のチェックを外しておきましょう。(開発中にパスワードの有効期限が切れてしまい、ログインできなくなるのを防ぐためです)

testユーザーの作成

続けて、ユーザーマッピングの設定に切り替え、データベースにチェックをつけ、OKをクリックします。

ユーザーマッピングの設定

データベースユーザーの作成
ユーザーマッピングの設定でデータベースユーザーの作成は出来ています。しかし、データベースへのアクセス権限を設定する必要があります。「Cards_DB」→「📁セキュリティ」→「📁ユーザー」→「test」を右クリックし、プロパティをクリックします。
testユーザーのプロパティ設定メンバーシップを選択し、メンバーシップにdb_datareader/db_datawriter/db_ddladminにチェックをつけてOKをクリックします。
testユーザーのメンバーシップの設定を変更これでSQLServerへの設定は全て完了です。

DB接続フォームの作成

SQLServerへの接続に必要な情報をユーザーに入力してもらうためのフォームを作成していきます。

コンポーネントの配置

前の記事で、Fm_MainControlを作成した時と同様に、CardAppを右クリックし、追加をクリック。続けて、フォームを選択します。

接続フォームの作成

「Fm_SQLServerConnection」と入力し、追加。

接続フォーム名を作成

今回は下のように配置してください。

接続フォームのUIを設定

各コンポーネントのプロパティは以下のテーブルと画像を参考に設定してください。特に、Nameプロパティの設定ミスがないようにしましょう。

▼配置するコンポーネント▼

  • Panel ×2
  • Label ×4
  • TextBox ×3
  • RadioButton ×2
  • Button ×1
コンポーネント Name Text Font ReadOnly BackColor
Panel panel1(何でもOK) SandyBrown
Panel panel2(何でもOK) SandyBrown
Label label1(何でもOK) SQLServerに接続
Label label2(何でもOK) サーバー名:
Label label3(何でもOK) ユーザー名:
Label label4(何でもOK) パスワード:
TextBox ServerNameTxtBox
TextBox UserNameTxtBox True
TextBox PasswordTxtBox True
RadioButton radioButton1 Windows認証
RadioButton radioButton2 SQLServer認証
Button BtnConnection 接続 10.125

※「ー」はデフォルトです。

接続フォームのコンポーネントを配置

static変数の宣言

static変数を利用して、SQLServerへの接続文字列作成に必要なユーザー入力値を、コーディングしていきましょう。

▼スタティック変数の解説はこちら▼

Fm_SQLServerConnectionを右クリックし、コードの表示をクリックします。以降、コードの表示をしてからコーディングする場合は以下の手順を踏むようにしてくださいね。

コードの表示

コーディングをする際は、以下のようにコードタブとデザイナータブを並べておくと便利です。

コードタブとデザイナータブ

ServerName」「UserName」「Password」の3つの変数を作成します。

public partial class Fm_SQLServerConnection : Form
{
    public static string ServerName;
    public static string UserName;
    public static string Password;
    public Fm_SQLServerConnection()
    {
        InitializeComponent();
    }
}

切り替え時イベントの作成

ラジオボタンが切り替えられた際に、処理を行なうイベントを作成します。まずは、先ほど配置したradioButtonコンポーネントを選択します。続けて、radioButton1/radioButton2をダブルクリックしてください。

クリックイベントの作成

もしくは、先ほどNameやText、BackColorプロパティを選択したプロパティウィンドウからクリックイベントを作成することもできます。

プロパティウィンドウからイベントを作成

下のようにコードが表示されていればうまく作成出来ています。

public partial class Fm_SQLServerConnection : Form
{
    //static変数とコンストラクタは省略
    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
    }
    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {
    }
}

radioButton1_CheckedChangedの中にコーディングすると、radioButton1がチェックされた(WIndows認証がチェックされた)時の処理を書くことができます。

では、コードを書いていきます。radioButton1がチェックされると、ユーザー名/パスワードの入力欄が使用不可になり、radioButton2がチェックされると、ユーザー名/パスワードの入力欄が使用可能になるようにします。ユーザーの操作を制限するのは先ほど設定したReadOnlyプロパティです。では、以下のようにコーディングしてください。

public partial class Fm_SQLServerConnection : Form
{
    //static変数とコンストラクタは省略
    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        UserNameTxtBox.ReadOnly = true;
        PasswordTxtBox.ReadOnly = true;
    }

    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {
        UserNameTxtBox.ReadOnly = false;
        PasswordTxtBox.ReadOnly = false;
    }
}

コード側でプロパティを設定する場合は、「(コンポーネント名).(プロパティ名)」とします。今回はUserNameTxtBoxコンポーネントのReadOnlyプロパティを設定したいので、「UserNameTxtBox.ReadOnly」とします。これで、ラジオボタンが切り替えられると同時に、フォームの表示が切り替わるようになりました。

接続ボタンのクリックイベント

同様に、接続ボタンのイベントも作成していきましょう。BtnConnectionボタンをダブルクリックするかプロパティウィンドウのクリックイベントからイベントを作成します。

接続ボタンクリックイベントの作成

作成したクリックイベントの中に、以下のようにコーディングします。

using System.Data.SqlClient;

private void BtnConnection_Click(object sender, EventArgs e)
{
    try
    {
        //Windows認証
        ServerName = ServerNameTxtBox.Text;
        //SQLServer認証
        if (radioButton2.Checked)
        {
            UserName = UserNameTxtBox.Text;
            Password = PasswordTxtBox.Text;
        }
        string sConnectionString = SQLMethod.SQLConnect(ServerName, UserName, Password); //※後ほど作成します。
        using (var conn = new SqlConnection(sConnectionString))
        {
            conn.Open();
            conn.Close();
        }
        MessageBox.Show("接続が完了しました。");
        this.DialogResult = System.Windows.Forms.DialogResult.OK; //後ほど解説します。
        this.Close();
    }
    catch (SqlException error)
    {
        MessageBox.Show(error.Message);
        MessageBox.Show("接続に失敗しました。");
    }
    catch (Exception error)
    {
        MessageBox.Show(error.Message);
        MessageBox.Show("予期せぬ例外が発生しました。");
    }
}

※14行目のSQLMethodクラスのSQLConnectメソッドは次の章で作成します。

「using System.Data.SqlClient」を(namespace CardAppの上の行辺りに)追加しておいてください。これは名前空間(namespase)を省略して書けるため、コードが読みやすくなります。

▼usingステートメントの解説はこちら▼

SQLServerへの接続確認処理をtry文の中に記載しています。Windows認証とSQLServer認証のためにユーザーが入力したTextBoxの値は先に用意したstatic変数に格納して使用します。

15行目では、SqlConnectionクラスのconnインスタンスを作成します。これはデータベース接続クラスの一つで、接続文字列をコンストラクタに渡して接続確認の準備をします。using(var conn…)の中にある「conn.Open()」と「conn.Close()」でSQLServer接続/切断をしています。

catch文はtry文の中でエラーが発生した際に、処理を中断し、catch文の中の処理を実行する構文です。

▼try-catch文の解説はこちら▼

では、データベース操作を行なうクラス「SQLMethod.cs」を作成していきましょう。

データベース操作クラスの作成

データベース操作クラスを作成します。「CardApp」プロジェクトを右クリックし、「追加(D)」をクリック。「クラス(C)…」をクリックします。

クラス名を追加すると、新しい項目の追加ウィンドウが表示されます。クラスが選択されていることを確認し、クラス名「SQLMethod.cs」と入力し、追加をクリックします。

クラス名を設定する

SQLConnectメソッドの作成

SQLConnectメソッドは接続文字列を作成する共通関数です。SQLServerの接続方法は2通り、「Windows認証」「SQLServer認証」です。今回の名刺アプリでは、両方の接続方法を実装します。

変数の宣言について分からない方はこちらをお読みください。

▼C#の変数宣言の解説はこちら▼

▼C#メソッドの解説はこちら▼

Windows認証
Windows認証には「サーバー名」「接続DB名」が必要です。今回は接続するデータベースを事前に作成しているので、initCatalogに接続DB名を「Cards_DB」と入力しています。
ちなみに、Windows認証の接続には「Server=サーバー名; Database=データベース名; Integrated Security=True;」と接続文字列を渡すことで接続出来ます。
class SQLMethod
{
    public static string SQLConnect(string Source)
    {
        string dataSource = Source;
        string initCatalog = "Cards_DB";
        string connectionString = "";

        //Windows認証の接続文字列
        connectionString = @"Server=" + dataSource + @";Database=" 
                                + initCatalog + ";Integrated Security=True;";

        return connectionString;
    }
}
SQLServer認証
SQLServer認証には「サーバー名」「接続DB名」「ユーザー名」「パスワード」が必要です。そのため、SQLConnectの引数の中にUserNameとPWを用意しました。PWが引数として渡された場合、SQLServer認証で接続されるように分岐しています。
ちなみに、SQLServer認証の接続には「Server=サーバー名; Database=データベース名; User ID=ユーザー名; Password=パスワード; 」と接続文字列を渡すことで接続出来ます。
class SQLMethod
{
    public static string SQLConnect(string Source,, string UserName = "", string PW = "")
    {
        string dataSource = Source;
        string initCatalog = "Cards_DB";
        string connectionString = "";

        if (string.IsNullOrEmpty(PW))
        {
            //Windows認証の接続文字列
            connectionString = @"Server=" + dataSource + @";Database=" 
                                    + initCatalog + ";Integrated Security=True;";
        }
        else
        {
            //SQLServer認証の接続文字列
            userId = UserName;
            passWord = PW;

            connectionString = @"Server=" + dataSource + @";Database=" 
                                    + initCatalog + @";User ID=" 
                                    + userId + @";Password=" + passWord + @";";
        }
        return connectionString;
    }
}

このメソッドが接続フォームの接続ボタンをクリックした際に呼び出しています。続いて、この接続文字列を利用してデータベースを操作するメソッドを作成していきます。

SQL操作メソッドの作成

データベースにデータを「挿入/選択/更新/削除」するメソッドを作成します。データベースへの接続は先ほどのSQLConnectメソッドを利用していきます。
挿入(Insert)メソッド
まずはデータを挿入するInsert文を作成します。
using System;
using System.Data.SqlClient;
using System.Windows.Forms;

class SQLMethod
{
    public static void SQLInsert(string sTable, string sField, string sValue)
    {
        try
        {
            using (var conn = new SqlConnection(SQLConnect(Fm_SQLServerConnection.SQLServerName, Fm_SQLServerConnection.UserName, Fm_SQLServerConnection.Password)))
            using (var command = conn.CreateCommand())
            {
                //接続を確立
                conn.Open();

                //INSERT文の準備
                command.CommandText =
                    string.Format("INSERT INTO {0} ({1}) VALUES ({2});", sTable, sField, sValue);

                //SQLの実行
                command.ExecuteNonQuery();

                conn.Close();

                MessageBox.Show("名刺をデータベースに追加しました。");
            }
        }
        catch (SqlException error)
        {
            MessageBox.Show(error.ToString());
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
    }
}

まずはusing文にSystem.Data.SqlClientSystem.Windows.Formsを追加してください。

12行目のSqlConnectionクラスのインスタンスを作成する部分は先ほどの接続文字列を返すSQLConnectと同様の処理です。

13行目ではSQL操作をするコマンドを作成するCreateCommandメソッドでcommandインスタンスを作成します。

20~21行目にある、commandインスタンスにはCommandTextプロパティでSQL文を挿入できます。「INSERT INTO テーブル名 (列名) VALUE (値); 」という構文にメソッドの引数を渡しています。

そして、24~25行目でcommand.ExecuteNonQueryで挿入したSQL文を実行します。これで、CardsDBにデータを挿入する処理が記載できました。

選択(Select)メソッド
次に、データベースからデータを選択して利用するSelect文のSQL文字列を返すメソッドを作成します。以下のようにコーディングしてください。
using System;
using System.Data.SqlClient;
using System.Windows.Forms;

class SQLMethod
{
    public static string SQLSelect(string sField, string sTable, string sWhere = "", string sOrderby = "")
    {
        try
        {
            string commandText = "";
            commandText =
                string.Format("SELECT {0} FROM {1}", sField, sTable);
            if (!sWhere.Equals(""))
            {
                commandText += string.Format(" WHERE {0}", sWhere);
            }
            if (!sOrderby.Equals(""))
            {
                commandText += string.Format(" ORDER BY {0}", sOrderby);
            }
            return commandText;
        }
        catch (SqlException error)
        {
            MessageBox.Show(error.ToString());
            return "";
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
            return "";
        }
    }
}
8行目、メソッドの引数の中にsWhereとsOrderbyがあります。sWhere = “”は引数を渡さずにメソッドが使用できます。select文は「WHERE」または「ORDER BY」を加えて、取得したデータに絞り込みをかけることができます。これらは必ずしも使用するものではありませんので、引数に空白文字列を渡しています。
15~16行目、20行目にはstring型にあるメソッド「Equals」を用いて、sWhere/sOrderbyに引数が渡された場合のみ、commandTextに文字列を加えるようにします。
例えば、sField = , sTable = Cards_Table, sWhere = id=”5″ と引数を渡すと、idが5のデータのみが取得できるクエリ「SELECT * FROM Cards_Table WHERE id = 5; 」が作成できます。
更新(Update)メソッド
Updateメソッドはデータベースのデータを更新できるメソッドです。「UPDATE (テーブル名) SET 列名 (WHERE (条件式) ORDER (条件式))」クエリを作成し、実行します。
using System;
using System.Data.SqlClient;
using System.Windows.Forms;

class SQLMethod
{
    public static void SQLUpdate(string sTable, string sField, string sWhere = "", string sOrderby = "")
    {
        try
        {
            using (var conn = new SqlConnection(SQLConnect(Fm_SQLServerConnection.ServerName, Fm_SQLServerConnection.UserName, Fm_SQLServerConnection.Password)))
            using (var command = conn.CreateCommand())
            {
                //接続を確立
                conn.Open();

                //Update文の準備
                command.CommandText =
                    string.Format("UPDATE {0} SET {1}", sTable, sField);
                if (!sWhere.Equals(""))
                {
                    command.CommandText += " WHERE " + sWhere.ToString();
                }
                if (!sOrderby.Equals(""))
                {
                    command.CommandText += " ORDER BY " + sOrderby.ToString();
                }
                //SQLの実行
                command.ExecuteNonQuery();

                conn.Close();

                MessageBox.Show("登録内容を更新しました。");
            }
        }
        catch (SqlException error)
        {
            MessageBox.Show(error.ToString());
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
    }
}
Insert文、Select文で説明した内容と大差ないため、コードの説明は不要かと思います。
削除(Delete)メソッド
Deleteメソッドはデータベースのデータを削除するメソッドです。Updateメソッドと処理はほとんど同じです。「DELETE (テーブル名) SET 列名 (WHERE (条件式) ORDER (条件式))」クエリを作成し、実行します。
using System;
using System.Data.SqlClient;
using System.Windows.Forms;

class SQLMethod
{
    public static void SQLInsert(string sTable, string sField, string sValue)
    {
        try
        {
            DialogResult dr = MessageBox.Show("本当に削除しますか?", "確認", MessageBoxButtons.YesNo);

            if(dr == DialogResult.Yes)
            {
                using (var conn = new SqlConnection(SQLConnect(Fm_SQLConnection.SQLServerName, Fm_SQLConnection.UserName, Fm_SQLConnection.Password)))
                using (var command = conn.CreateCommand())
                {
                    //接続を確立
                    conn.Open();

                    //DELETE文の準備
                    command.CommandText =
                        string.Format("DELETE FROM {0} ", sTable);

                    if (!sWhere.Equals(""))
                    {
                        command.CommandText += string.Format("WHERE {0}", sWhere);
                    }
                    if (!sOrderby.Equals(""))
                    {
                        command.CommandText += string.Format("ORDER BY {0}", sOrderby);
                    }
                    //SQLの実行
                    command.ExecuteNonQuery();

                    conn.Close();

                    MessageBox.Show("名刺をデータベースに追加しました。");
                }
             }
        }
        catch (SqlException error)
        {
            MessageBox.Show(error.ToString());
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
    }
}

メソッドの作成は以上です。

実行して確認

フォームが正しく表示され、意図した表示が出来ているかどうか、確認していきましょう。現在CardAppを実行(F5キー)するとFm_MainControlフォームが表示されます。

これは、Program.csでアプリケーションの実行時にFm_MainControlのインスタンスが作成されているためです。今回は、接続フォームを最初に表示して、接続ができた場合、Fm_MainControlを表示します。

Application.SetCompatibleTextRenderingDefault(false);の下にあるApplication.Run行を以下のように書き換えてください。

static class Program
{
    static void Main()
    {
        while (true)
        {
            using (var dlg = new Fm_SQLServerConnection())
            {
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    Application.Run(new Fm_MainControl());
                }
                else
                {
                    return;
                }
            }
        }
    }
}

Fm_SQLServerConnectionの接続ボタンクリックイベントに「this.DialogResult = System.Windows.Forms.DialogResult.OK」と書かれていました。これは接続ボタンがクリックされ、問題なく接続できた場合に、ダイアログのOKプロパティをTrueにして処理を行なうためにコーディングしています。

このコーディング後に実行(F5)してみると、接続フォームが表示されます。ユーザー名にSQLServer Management Studioの接続画面と同様のユーザー名を入力し、Windows認証で接続してみてください。すると、接続フォーム→メインコントロールフォームが表示され、メインコントロールフォームを閉じると、再度接続フォームが表示されるようになります。

最後に

以上でデータベースの作成とデータベースサーバー接続フォーム、データ操作メソッドの作成が出来ました。今回は、かなり作成箇所が多くて大変だったと思います。

次は名刺を追加するコントロールを作成します。頑張っていきましょう!

コメント

タイトルとURLをコピーしました