【第62号】
第62号(2008.3.25発行) ====================================================================== ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★ (VB 2005 Express & SQL Server 2005 Express) ---------------------------------------------------------------------- いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中 心に掲載します。今後ともよろしくお願い申し上げます。 すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/ ====================================================================== ■■ 社員テーブルに追加する 4 ■■ 社員コード、社員氏名、カナ名、部署コードを入力して、追加ボタンをクリッ クすると、入力したデータのエラーチェックをして、エラーが無ければ、社員 テーブルに1レコード追加します。接続文字列は、app.configに登録しておき ます。 【sampleデータベースの社員テーブル】 ---------------------------------------------------------------------- key 列 名 データ型 nullを許容 備 考 ---------------------------------------------------------------------- ○ 社員コード nchar(5) 許容しない 英数字のみ − 社員氏名 nvarchar(20) 許容しない − 社員カナ nvarchar(40) 許容しない − 部署コード nchar(4) 許容しない − 更新日時 datetime 許容しない ---------------------------------------------------------------------- 【sampleデータベースの部署テーブル】 ---------------------------------------------------------------------- key 列 名 データ型 nullを許容 備 考 ---------------------------------------------------------------------- ○ 部署コード nchar(4) 許容しない 英数字のみ − 部署名 nvarchar(20) 許容しない − 更新日時 datetime 許容しない ---------------------------------------------------------------------- コンボボックスのDropDownStyleプロパティは、DropDownListを選択して、テ キストボックス部分を入力できないように設定します。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 社員テーブル追加 _□×┃ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ Label1 TxtShainCode ┃┌―――――┐ ┌―――――┐ ┃│社員コード│ │ │ ┃└―――――┘ └―――――┘ ┃ Label2 TxtShainShimei ┃┌―――――┐ ┌――――――――┐ ┃│社員氏名 │ │ │ ┃└―――――┘ └――――――――┘ ┃ Label3 TxtShainKana ┃┌―――――┐ ┌――――――――――――――┐ ┃│社員カナ │ │ │ ┃└―――――┘ └――――――――――――――┘ ┃ Label4 CboBusho ┃┌―――――┐ ┌――――――――┐ ┃│部署コード│ │ │▼│ ┃└―――――┘ └――――――――┘ ┃ BtnInsert BtnClear ┃┌――――┐ ┌―――――┐ ┃│ 追加 │ │ クリア │ ┃└――――┘ └―――――┘ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Public Class FormInsert59 '----------<< 追加ボタンクリック処理 >>---------- Private Sub BtnInsert_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles BtnInsert.Click Try Dim shain As DataRow 'ClsShainTableIOクラスは59号〜62号参照 Dim dbIO As New ClsShainTableIO() 'createDataRowメソッドは60号参照 shain = dbIO.createDataRow() shain("社員コード") = Me.TxtShainCode.Text shain("社員氏名") = Me.TxtShainShimei.Text shain("社員カナ") = Me.TxtShainKana.Text shain("部署コード") = Me.CboBushoMei.SelectedValue 'InsertRecordメソッドは今号参照 'ClsInsertShainクラスは61号参照 dbIO.InsertRecord(New ClsInsertShain(shain)) 'フォーム初期設定 Me.ClearForm() Catch oExcept As myShainCodeException '社員コード例外が発生した時の処理 MessageBox.Show(oExcept.Message, "社員コード入力エラー") Me.TxtShainCode.Focus() Catch oExcept As myShainSimeiException '社員氏名例外が発生した時の処理 MessageBox.Show(oExcept.Message, "社員氏名入力エラー") Me.TxtShainShimei.Focus() Catch oExcept As myShainKanaException '社員カナ例外が発生した時の処理 MessageBox.Show(oExcept.Message, "社員カナ入力エラー") Me.TxtShainKana.Focus() Catch oExcept As myDBIOException 'DBIO例外が発生した時の処理 MessageBox.Show(oExcept.Message, "DBIO例外発生") Catch oExcept As Exception 'その他例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") End Try End Sub '以下省略(59号〜61号参照) End Class ---------------------------------------------------------------------- ■■ InsertRecord メソッド ■■ InsertRecordメソッドは、各テーブルアクセスクラスに実装するため、 ClsSampleDBIOクラスに抽象メソッドとして宣言する方法もありますが、すべ ての継承クラスで実装するのを避けるために、インターフェースを利用して実 装することにします。 まず、次のようにインターフェースのメンバー宣言を追加します。追加する場 所は、ClsSampleDBIO.vbファイルの ClsSampleDBIOクラスの直前が見やすいで しょう。 Public Interface IDBIO Function InsertRecord(ByVal Shain As ClsInsertShain) As Integer End Interface そして、ClsSampleDBIO クラスを継承したClsShainTableIO クラスに、 InsertRecordメソッドを実装する場合には、次のように、Implementsステート メントを使って、IDBIOを指定します。 Public Class ClsShainTableIO Inherits ClsSampleDBIO Implements IDBIO さらに、InsertRecordメソッドのメンバー宣言に Implementsキーワードを 使って、インターフェイス名.メソッド名(IDBIO.InsertRecord)を指定しま す。戻り値と引数の型は、Interfaceの定義と一致させる必要がありますが、 メソッド名は自由に付けられます。混乱を避けるため同じ名称が良いでしょう。 Public Function _ InsertRecord(ByVal Shain As ClsInsertShain) As Integer _ Implements IDBIO.InsertRecord レコード追加処理は、NET Framework 2.0から追加されたTransactionScope ク ラスのトランザクション処理を使いました。このクラスを利用するためには、 あらかじめ参照設定で、System.Transactions を追加します。 TransactionScopeクラスを利用すれば、例外が発生した場合、自動的にロール バックされます。したがって、明示的にロールバックメソッドを呼び出す必要 はありません。 トランザクションをコミット(完了)するためには、Completeメソッドを呼び 出します。 --【プログラムソースリスト(ファイル名:ClsShainTableIO.vbに追加)】-- '******************************************************************* ' 機能:社員テーブルに1レコードを追加するメソッド ' 引数:ClsInsertShain型:追加する1レコード分のデータ ' 返値:integer型:追加したレコード数 '******1*********2*********3*********4*********5**********6********* Public Function _ InsertRecord(ByVal Shain As ClsInsertShain) As Integer _ Implements IDBIO.InsertRecord Dim retInsertCount As Integer 'リターン値 Try '引数チェック(引数が未設定だったら例外をスロー) If Shain Is Nothing Then Throw New myDBIOException("引数が未設定") End If 'トランザクション開始 Using tran As New TransactionScope Using con As New SqlConnection Using cmd As New SqlCommand '接続関連プロパティ設定(SetConnectionは58号参照) MyBase.SetConnection(con, cmd) '----------< SQL文の生成 >---------- cmd.CommandText = _ "INSERT INTO " & _ "社員テーブル(社員コード, 社員氏名, 社員カナ, " & _ "部署コード, 更新日時) " & _ "VALUES(@sCode, @sSimei, @sKana, @sBusho, @kosinDate)" 'SQL文の引数設定 cmd.Parameters.Clear() cmd.Parameters.Add _ (New SqlParameter("@sCode", SqlDbType.NChar, 5)) cmd.Parameters.Add _ (New SqlParameter("@sSimei", SqlDbType.NVarChar, 20)) cmd.Parameters.Add _ (New SqlParameter("@sKana", SqlDbType.NVarChar, 40)) cmd.Parameters.Add _ (New SqlParameter("@sBusho", SqlDbType.NChar, 4)) cmd.Parameters.Add _ (New SqlParameter("@kosinDate", SqlDbType.DateTime)) '引数に値を設定 cmd.Parameters("@sCode").Value = Shain.ShainCode cmd.Parameters("@sSimei").Value = Shain.ShainSimei cmd.Parameters("@sKana").Value = Shain.ShainKana cmd.Parameters("@sBusho").Value = Shain.BushoCode cmd.Parameters("@kosinDate").Value = Now() 'DB接続を開く con.Open() 'データベースの更新を実行 retInsertCount = cmd.ExecuteNonQuery() End Using End Using '1レコード追加なら正常(通常これしかありえない) If retInsertCount = 1 Then 'トランザクション完了(コミット) tran.Complete() Else '1レコード追加以外なら例外をスロー 'コミットしなければ、自動的にロールバックされる Throw New myDBIOException _ ("社員テーブル:レコード追加処理が失敗しました。") End If End Using Catch ex As Exception '例外が発生したら、例外をスロー Throw New Exception("例外発生:" & ex.ToString) End Try '◆リターン Return retInsertCount End Function ---------------------------------------------------------------------- これで、レコード追加処理は完成です。次号からは、1レコードを削除処理を 作成していきます。 ====================================================================== VB.NET データベースプログラミング奮闘記 発行者:ウェブ実験室(ado.netアットマークライヴドットジェーピーlive.jp) http://park5.wakwak.com/‾weblab/ ---------------------------------------------------------------------- このメールマガジン(マガジンID: 0000128094)は、 インターネットの本屋さん『まぐまぐ』から配信されています。 http://www.mag2.com/ 【購読中止の方法】購読の中止は次のホームページからお願い致します。 http://park5.wakwak.com/‾weblab/ http://www.mag2.com/m/0000128094.htm ---------------------------------------------------------------------- このメールマガジン及び「すぐ使えるADO.NET」ホームページで公開している ソースプログラム・データの利用により生じた損害等については、発行者は 一切責任を負いません。ソースプログラムの再利用は自由です。著作権は発行 者が所有します。 このメールマガジン及び「すぐ使えるADO.NET」ホームページに掲載されてい る会社名・製品名等は、各社の登録商標または商標です。 ======================================================================
↑このページ先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.