connet.lolipop.jp
CRUDプログラムを作成する
■︎ ディレクトリの構成
完成時における、プロジェクトのディレクトリの構成です。

〚ディレクトリ〛

■︎ CRUDの主要なソースコードの説明
目次以外のソースコードは、4ページの「MainForm.cs」クラスを参照。



◼︎ Productクラス

新しい「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; }
    }
}
◼︎ DbManagerクラス

データベースに対する接続操作や、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;
}
◼︎ 登録のSQLを作成

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からはその動作情報のデータなど取得することができます。


▪その2
プロパティウインドウから「Events」タブ(稲妻マーク)をクリックして、Actionの項目の中の「Click」上を
ダブルクリックすることでも、同様に作ることができます。

2.手書きで作る
4ページに掲載した「CRUDソースコード」の中のMainForm_Loadイベントハンドラーメソッドを参照。  MainForm_Loadメソッドも前記同様に作ります。


〚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
Search
Google
⬆ このページの先頭へ