新しい「Product.cs」クラスを作成します。次項の「DbManager.cs」クラスも同手順で作成。
このクラスは、アプリケーションのベースとなる情報を扱うクラスになります。
クラスのプロパティにデータの保持を他のクラスメソッドから定義して、データベースへのアクセス等の役割をになうことができます。
作成手順。
⬇︎
「プロジェクトウィンドウ」
⬇︎
➤ CrudSampleApp上を右クリック。 ➤ 「追加」 ➤ 「新しい項目」
➤ テンプレート枠の中の「クラス」を選択して、ファイル名欄にProduct.csと入力、「新規」ボタンを押す。
➤ 型テンプレートのファイルが生成されるので、下記のようにソースコードを書き換えてください。
〚Product.cs〛
using System;
namespace CrudSampleApp
{
// テーブル対応のクラス
public class Product
{
// プロパティ
public string Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
}
データベースに対する接続操作や、Productクラスと連携してデータアクセスを一元的に管理するクラスになります。
SQLiteConnectionクラスは、接続するSQLiteデータベースファイルをインスタンスに渡すことで、ファイルの存在の有無を確認します。存在しない場合は空のファイルを自動生成してくれます。テーブルついても同様に。
テーブルの構造はカラム数は全体で5カラム。ユーザー入力を行う操作は「Name」と「Address」の2カラムを作成してます。
〚DbManager.cs〛
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using System.Data.SQLite;
namespace CrudSampleApp
{
// データベースにアクセス
public class DbManager
{
public DataTable ConnectDatabase()
{
const string dbString = "Data Source=sample.db;Version=3";
// データベースが存在しないなら作成
using(var conn = new SQLiteConnection(dbString))
{
var resultdataTbl = new DataTable();
resultdataTbl.Clear();
conn.Open();
using (var cmd = new SQLiteCommand(conn))
{
// テーブルが存在しないなら作成
cmd.CommandText = "CREATE TABLE IF NOT EXISTS sampletbl(Id TEXT NOT NULL, Name TEXT NOT NULL, Address TEXT, Created_at TEXT NOT NULL, Updated_at TEXT NOT NULL)";
cmd.ExecuteNonQuery();
}
try
{
// DB読込みにアダプタクラスを利用
var dataAdp = new SQLiteDataAdapter();
// データをプロパティにセット
dataAdp.SelectCommand = new SQLiteCommand("SELECT * FROM sampletbl", conn );
// Fillメソットを使ってデータをテーブルに取込む
dataAdp.Fill(resultdataTbl);
}
catch (Exception ex)
{
MessageBox.Show("予期しないエラー!:{ex.Message}");
}
// データテーブルを返す
return resultdataTbl;
}
}
// 登録
public void InsertAccess(string sqlTxt, Product product, string crudMes)
{
const string connString = "Data Source=sample.db;Version=3";
using(var conn = new SQLiteConnection(connString))
{
conn.Open();
// トランザクションの開始
var transaction = conn.BeginTransaction();
try
{
using (var cmd = new SQLiteCommand(conn))
{
// 登録SQL文とデータを設定
cmd.CommandText = sqlTxt;
cmd.Parameters.Add("$Name", DbType.String).Value = product.Name;
cmd.Parameters.Add("$Address", DbType.String).Value = product.Address;
// DBへ送信
if(cmd.ExecuteNonQuery() != -1)
{
// 確定
transaction.Commit();
MessageBox.Show(crudMes);
}
}
}
catch (Exception ex)
{
// エラー発生 - 開始前に戻す
transaction.Rollback();
MessageBox.Show("予期しないエラー!:{ex.Message}");
}
}
}
// 更新
public void UpdateAccess(string sqlTxt, Product product, string crudMes)
{
const string connString = "Data Source=sample.db;Version=3";
using(var conn = new SQLiteConnection(connString))
{
conn.Open();
// トランザクションの開始
var transaction = conn.BeginTransaction();
try
{
using (var cmd = new SQLiteCommand(conn))
{
// 更新SQL文とデータを設定
cmd.CommandText = sqlTxt;
cmd.Parameters.Add("$Address", DbType.String).Value = product.Address;
// DBへ送信
if(cmd.ExecuteNonQuery() != -1)
{
// 確定
transaction.Commit();
MessageBox.Show(crudMes);
}
}
}
catch (Exception ex)
{
// エラー発生 - 開始前に戻す
transaction.Rollback();
MessageBox.Show("予期しないエラー!:{ex.Message}");
}
}
}
// 削除
public void deleteAccess(string sqlTxt, string crudMes)
{
const string connString = "Data Source=sample.db;Version=3";
using(var conn = new SQLiteConnection(connString))
{
conn.Open();
// トランザクションの開始
var transaction = conn.BeginTransaction();
try
{
using (var cmd = new SQLiteCommand(conn))
{
// 削除SQL文を設定
cmd.CommandText = sqlTxt;
if(cmd.ExecuteNonQuery() != -1)
{
// 確定
transaction.Commit();
MessageBox.Show(crudMes);
}
}
}
catch (Exception ex)
{
// エラー発生 - 開始前に戻す
transaction.Rollback();
MessageBox.Show("予期しないエラー!:{ex.Message}");
}
}
}
}
}
クラスフィールド変数を複数のメソッド間で共有し、メソッドの引数を経由せず
直接フィールドにアクセスすることで処理動作の効率化や可読性を図った。
プログラムにはフィールド変数を引数として明示的に設定したメソッドがあります。
これらのメソッドの引数とパラメーターは、当然省略は可能です。省略する場合はメソッド内の変数をフィールド変数に修正してください。
〚MainForm.cs〛
/** クラスフィールド */
// クラスのインスタンス変数定義
private Product product; // Product.cs
private DbManager dbmanager; // DbManager.cs
private DataTable dataTbl;
private DataGridViewButtonColumn editColumn;
// 全レコード数
private int allRowCount;
プログラムが最初に呼び出すMainメソッドから実行されるクラスと同名な特殊なメソッドで、システムが型テンプレートを自動的に生成します。
アプリケーションのスタートはフォームの初期化から。
〚MainForm.cs〛
// コンストラクタ
public MainForm()
{
// フォーム初期化
InitializeComponent();
// データロード
DataLoad();
// コントロールの初期設定
ControlInit();
}
データベースから全データを取得します。
〚MainForm.cs〛
// データロード
private void DataLoad()
{
// DataTableのインスタンス作成
dataTbl = new DataTable();
// DbManagerクラスメソットからデータテーブルを取得
dbmanager = new DbManager();
dataTbl = dbmanager.ConnectDatabase();
// コントロールにレコード数を表示
allRowCount = dataTbl.Rows.Count;
allRecCountBox.Text = allRowCount.ToString();
// dgvにデータを表示
dgv.DataSource = dataTbl;
}
Productクラスへの入力データのセットや、登録を行うSQL文を作成する、イベントハンドラーメソッドです。
ボタンのクリックなどの操作を行った場合、イベントが発生その情報をメッセージとして受取り実行されるメソッドになります。
主キーとなる「Id」カラムのデータ生成は、グローバルな一意識別子を生成する「Guid」クラスを利用しました。
Idの生成には自動インクリメントがありますが、好みで調整してみてください。
ここでイベントメソッドの作り方にSharpDevelop(IDE)には、主に二通りの方法があります。
1.デザイン機能を使う
▪その1
「MainForm.cs」ファイル(クラス)を開く。
⬇︎
➤ コードウィンドウにあるデザインボタンをクリックしてコントロールを表示する。
➤ コントロールの「Entry」ボタン上をダブルクリック。
➤ ソースコードの最後に、entryの名前の後に_Clickの文字が自動的に書き加えられた
ハンドラーメソッド(型テンプレート)が追加されます。コードを確認してみてください。
デザイン機能を使って作成したメソッドは全て、[ MainForm.Designer.cs ]に以下のようなかたちで自動
生成されるので、こちらも確認してみてください。
this.entry.Click += new System.EventHandler(this.entry_Click);
EventHandlerはオブジェクトのように扱うことができるデリゲート型(Delegate)と言われ、メソッドを
作ることができます。
ここではnew演算子を使って「entry_Click」名のメソッドを作成しています。
パラメータのsenderはコントロールの参照を、eからはその動作情報のデータなど取得することができます。
〚MainForm.cs〛
// 登録のSQLを作成
private void entry_Click(object sender, EventArgs e)
{
if (guidBox.Text != "")
{
MessageBox.Show("表示しているデータをクリアして、\n新しいデータを入力して下さい。", "登録", MessageBoxButtons.OK, MessageBoxIcon.Hand);
return;
}
// テキストボックスから登録データを変数に代入
string nameVal = nameBox.Text;
string addressVal = addressBox.Text;
// Nameの入力チェック
if (nameVal == "")
{
MessageBox.Show("Nameの入力が不正です。", "登録", MessageBoxButtons.OK, MessageBoxIcon.Hand);
return;
}
else
{
DialogResult entMes = MessageBox.Show("表示のデータを登録しますか?。", "登録", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (entMes == DialogResult.Yes)
{
// グローバルな一意識別子を生成
Guid guid = Guid.NewGuid();
// 桁区切り無しの文字列に変換
string newUniqueId = guid.ToString("N");
// タイムスタンプ取得
string entryTime = DateTime.Now.ToString();
// テーブル対応のProductクラス - Productr.cs
// >インスタンスの作成
product = new Product();
// >プロパティに登録データを設定
product.Name = nameVal;
product.Address = addressVal;
// 登録SQLの作成 データ処理は「Linq」ライブラリに依存 - 処理に"$"を使用
string entrySqlTxt = "INSERT INTO sampletbl(Id, Name, Address, Created_at, Updated_at) VALUES('" + newUniqueId + "', $Name, $Address, '" + entryTime + "','" + entryTime + "')";
const string entryMes = "登録しました。";
// データ登録へ
dbmanager.InsertAccess(entrySqlTxt, product, entryMes);
// データロード
DataLoad();
// テキストクリア
TextBoxClear();
}
}
}//end entry_Click