C#で名刺アプリを作成する手順を解説するシリーズ、第2回目です。この記事では、名刺データを保管するデータベースの作成とデータベースにデータを挿入するメソッドを備えたクラス、そしてDB接続フォームを作成したいと思います。
では、早速はじめていきましょう。今回はコーディングをするので、難しく感じるかもしれませんが、かなり丁寧に説明していくので、ご安心ください。(分からない所があれば、@kintame_contactか記事のコメント欄にお願いします。)
目次はこちらです。
目次
SQLServerにデータベースを作成
SQLServerにデータベースを作成する手順を解説します。まだ、SQLServerをインストールされていない方は先にインストールしてください。
※データベースをちょっとだけ解説
データベースを作成する前に知っておきたい知識を軽く解説しておきます。
データベースは言わば、上の画像のような構造をしています。「データベース」の中に「テーブル」があり、テーブルの上から順に、「レコード」が挿入されていきます。テーブルのデータ1つひとつを「フィールド」といいます。
特に、重要なことは「データベース」の中に「テーブル」があるということです。
データベース作成
準備が出来たら、SQLServerを開きましょう。PCの検索欄に「SQL Server Management Studio」と入力するとアプリが起動できます。
起動出来ると真っ黒なフォームが開き、しばらく待つと下の画像のように「サーバーへの接続」フォームが表示されるので、「接続」をクリックします。
接続出来たら、画面左側のオブジェクトエクスプローラーにある、「📁データベース」を右クリックし、「新しいデータベース(N)…」をクリックします。
下のようなウィンドウが開くので、データベース名(N)に「Cards_DB」と入力してOKをクリック。
これでデータベースの作成は完了です。続いてデータを保管するテーブルを作成していきましょう。
テーブルの作成
Cards_DBの+マークを押し、テーブルを右クリック→新規作成(N)→テーブル(T)…を押します。
テーブルの列名とデータ型を以下のように設定します。idには主キーを設定します。idを右クリックして「主キーの設定(Y)」
間違いなく設定出来れば、「Ctrl+S」で保存します。すると、テーブル名を入力するウィンドウが表示されるので、「Cards_Table」としてください。
ユーザーの作成(※SQLServer認証のみ)
続いて、ユーザーを作成します。SQLServerにはログインユーザーとデータベースユーザーの2種類があります。これはSQLServerならではの仕様です。詳細は下の記事で解説しているため、省略しますが、「ログインユーザー」「データベースユーザー」の2つのユーザーを作成しなければならないということを覚えておいてください。
▼SQLServerのユーザー設定はこちら▼
ログインユーザーの作成ウィンドウが表示されます。ログイン名「test」、SQL Server認証に切り替え、パスワード「test」と入力しておきます。今回は「パスワードポリシーを適用する」のチェックを外しておきましょう。(開発中にパスワードの有効期限が切れてしまい、ログインできなくなるのを防ぐためです)
続けて、ユーザーマッピングの設定に切り替え、データベースにチェックをつけ、OKをクリックします。
DB接続フォームの作成
SQLServerへの接続に必要な情報をユーザーに入力してもらうためのフォームを作成していきます。
コンポーネントの配置
前の記事で、Fm_MainControlを作成した時と同様に、CardAppを右クリックし、追加をクリック。続けて、フォームを選択します。
「Fm_SQLServerConnection」と入力し、追加。
今回は下のように配置してください。
各コンポーネントのプロパティは以下のテーブルと画像を参考に設定してください。特に、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#メソッドの解説はこちら▼
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;
}
}
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操作メソッドの作成
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.SqlClientとSystem.Windows.Formsを追加してください。
12行目のSqlConnectionクラスのインスタンスを作成する部分は先ほどの接続文字列を返すSQLConnectと同様の処理です。
13行目ではSQL操作をするコマンドを作成するCreateCommandメソッドでcommandインスタンスを作成します。
20~21行目にある、commandインスタンスにはCommandTextプロパティでSQL文を挿入できます。「INSERT INTO テーブル名 (列名) VALUE (値); 」という構文にメソッドの引数を渡しています。
そして、24~25行目でcommand.ExecuteNonQueryで挿入したSQL文を実行します。これで、CardsDBにデータを挿入する処理が記載できました。
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 "";
}
}
}
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());
}
}
}
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認証で接続してみてください。すると、接続フォーム→メインコントロールフォームが表示され、メインコントロールフォームを閉じると、再度接続フォームが表示されるようになります。
最後に
以上でデータベースの作成とデータベースサーバー接続フォーム、データ操作メソッドの作成が出来ました。今回は、かなり作成箇所が多くて大変だったと思います。
次は名刺を追加するコントロールを作成します。頑張っていきましょう!
コメント