【第39号】
第39号(2006.3.30発行) ====================================================================== ★★ VB.NETデータベースプログラミング奮闘記 ★★ ---------------------------------------------------------------------- いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中 心に掲載しますので、今後ともよろしくお願い申し上げます。 すぐ使えるADO.NET --> サンプルプログラム満載 http://park5.wakwak.com/‾weblab/ ====================================================================== ■■ VB.NETワンポイント:DataRowオブジェクト ■■ 引数にDataTableオブジェクト変数を指定して、dataAdapterのFillメソッドを 呼び出すと、DataTableオブジェクトのDataRowオブジェクトに、取得されたレ コードが格納されます。 Dim row As DataRow Dim tbl As DataTable Dim dataAdapter As New OleDbDataAdapter() : dataAdapter.Fill(tbl) : DataTableオブジェクトのDataColumnオブジェクトが持つ列情報を利用すると、 DataRowオブジェクトを使って、テーブルにレコードを追加することができま す。DataRowオブジェクトは、DataTableオブジェクトのNewRowメソッドを呼び 出して生成します。 row = tbl.NewRow こうして生成されたrowインスタンスは、テーブルのフィールドを持って いますので、ここに画面からの入力値を保管することができます。たとえば、 上記のtblに社員テーブルのレコードが取得されていれば、テキストボックス (txtSyainCode)の値を row("社員コード") = Me.txtSyainCode.Text のように、rowオブジェクトに保管できます。もし、社員テーブルにないフィー ルド名を指定したり、正しい型のデータをセットしないと、例外がスローされ ます。 このDataRowオブジェクトを利用して、テーブルにレコードを追加します。 ---------------------------------------------------------------------- ■■ データベースアクセスクラスの汎用メソッドについて 8 ■■ テーブルに1レコードを追加するために、DataRowオブジェクトを生成する createDataRowメソッドと、テーブルに1レコードを追加するinsertRecordメ ソッドをclsDBIOクラスに追加します。今号では、createDataRowメソッドを説 明します。 その前に、テーブルがデータベースに存在するかしないかのチェック部分を、 PrivateメソッドのexistTableとして、clsDBIOクラスに追加します。使い方は、 次のようになります。 If Me.existTable(parTableName) = False Then Throw New myDBIOException("テーブルが存在しません") End If createDataRowメソッドでは、getKeyRecordメソッドを呼び出して、DataRowオ ブジェクトを作成します。引数には、レコードを追加するテーブル名とキー値 を指定します。キー値は、汎用的に使える値を指定します。キー値のレコード がテーブルになくても問題はありません。 Dim dt As DataTable dt = Me.getKeyRecord("テーブルの名称", "A") Dim dr As DataRow = dt.NewRow テーブルにレコードを追加するまでの手順は次のようになります。なお、エ ラーチェックはclsInsertSyainクラスに実装し、行データをPrivate変数に保 存します。insertRecordメソッドの引数にこのclsInsertSyainオブジェクトを 指定します。次号にclsInsertSyainクラスのソースリストを掲載します。 '***** 登録ボタンを押したときにレコードを追加する ***** Private Sub btnInsert_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnInsert.Click Try Dim oRow As DataRow Dim insertCount As Integer Dim oDBIO As New clsDBIO() 'DataRowオブジェクトの取得 oRow = oDBIO.createDataRow("社員テーブル") 'DataRowオブジェクトにフィールド値を保管 oRow("社員コード") = Me.txtSyainCode.Text oRow("社員氏名") = Me.txtSyainSimei.Text : 'clsInsertSyainのインスタンスを生成してエラーチェック 'コンストラクタでエラーチェック(エラーがあれば、例外をスロー) Dim oSyain As New clsInsertSyain(oRow) '1レコードを追加 insertCount = oDBIO.insertRecord(oSyain) Catch oExcept As 独自例外 '独自例外が発生した時の処理 Catch oExcept As Exception '例外が発生した時の処理 End Try End Sub --【プログラムソースリスト】------------------------------------------ Option Explicit On Imports System.Data.OleDb Imports System.Text.RegularExpressions '----------------- << データベースアクセスクラス >> ----------------- Public Class clsDBIO '--------------------< メンバ:変数 >-------------------- 'コネクション Private mConn As OleDbConnection 'コマンド Private mCommand As OleDbCommand 'テーブル名コレクション Private mTableNameList As New Collection() '******************************************************************* ' 機能:コンストラクタ ' 引数:なし ' 履歴:2005.12.16 追加したFinallyブロックにmConn.Close()を移動 '******************************************************************* Public Sub New() '第35号を参照願います。 'http://park5.wakwak.com/‾weblab/mag035.html End Sub '******************************************************************* ' 機能:キー値のレコードの有無を調べるメソッド ' 引数:テーブル名、キー値 ' 戻値:ある-->True、ない-->False ' 備考:キー値は英数字 "_" "-" で構成されていること '******************************************************************* Public Function existKeyRecord( _ ByVal parTableName As String, ByVal parKeyValue As String) As Boolean '第33号を参照願います。 'http://park5.wakwak.com/‾weblab/mag033.html End Function '******************************************************************* ' 機能:複数キー値のレコードの有無を調べるメソッド ' 引数:テーブル名、キーフィールド名配列、キー値配列 ' 戻値:ある-->True、ない-->False ' 備考:キー値は英数字 "_" "-" で構成されていること '******************************************************************* Public Function existKeyRecord(ByVal parTableName As String, _ ByVal parKeyfield() As String, _ ByVal parKeyValue() As String) As Boolean '第34号を参照願います。 'http://park5.wakwak.com/‾weblab/mag034.html End Function '******************************************************************* ' 機能:引数にテーブルと主キー値を指定してレコードを取得するメソッド ' 引数:String型 テーブル名 ' 引数:String型 主キー値 ' 戻値:DataTable型 取得したレコード ' 備考:キー値は英数字 "_" "-" で構成されていること '******************************************************************* Public Function getKeyRecord(ByVal parTableName As String, _ ByVal parKeyValue As String) As DataTable '第35号を参照願います。 'http://park5.wakwak.com/‾weblab/mag035.html End Function '******************************************************************* ' 機能:複数キー値のレコードを取得するメソッド ' 引数:String型:テーブル名 ' 引数:String型:主キーフィールド名配列 ' 引数:String型:主キーフィールドに対応するキー値配列 ' 戻値:DataTable型:取得したレコード情報 ' 備考:キー値は英数字 "_" "-" で構成されていること '******************************************************************* Public Function getKeyRecord(ByVal parTableName As String, _ ByVal parKeyfields() As String, _ ByVal parKeyValues() As String) As DataTable '第36号を参照願います。 'http://park5.wakwak.com/‾weblab/mag036.html End Function '******************************************************************* ' 機能:テーブルの全レコードを取得するメソッド ' 引数:String型:テーブル名 ' 戻値:DataTable型:取得したレコード '******************************************************************* Public Function getAllRecords(ByVal parTableName As String) As DataTable '第37号を参照願います。 'http://park5.wakwak.com/‾weblab/mag037.html End Function '******************************************************************* ' 機能:引数に指定した主キー値の範囲のレコードを取得するメソッド ' 引数:String型-->テーブル名 ' 引数:String型-->主キーの最少値 ' 引数:String型-->主キーの最大値 ' 引数:String型-->主キーフィールド名(指定しない場合は、既定値の空文字列) ' 戻値:DataTable型:取得したレコード ' 備考:キー値は英数字 "_" "-" で構成されていること '******************************************************************* Public Function getRecordsOfRangeOfKey( _ ByVal parTableName As String, _ ByVal parMinValueOfKey As String, _ ByVal parMaxValueOfKey As String, _ Optional ByVal parKeyfield As String = "") _ As DataTable '第38号を参照願います。 'http://park5.wakwak.com/‾weblab/mailMagazine.html End Function '******************************************************************* ' 機能:テーブル対応の1行を生成するメソッド ' 引数:String型:テーブル名 ' 戻値:DataRow型:生成した行 '******************************************************************* Public Function createDataRow(ByVal parTableName As String) As DataRow Dim retDataRow As DataRow 'リターン値 Try '★引数チェック If parTableName = Nothing Then Throw New myDBIOException("引数テーブル名が未設定") End If 'テーブル存在チェック If Me.existTable(parTableName) = False Then Throw New myDBIOException("テーブルが存在しません") End If Dim dt As DataTable dt = Me.getKeyRecord(parTableName, "9") retDataRow = dt.NewRow Catch oExcept As myDBIOException Throw New myDBIOException(oExcept.Message) Catch oExcept As Exception Throw New Exception _ ("clsDBIOのcreateDataRowで例外発生" + oExcept.ToString) End Try Return retDataRow End Function '******************************************************************* ' 機能:テーブル名をチェックするメソッド ' 引数:String型:テーブル名 ' 戻値:Boolean型:引数のテーブル名が正しい時True、誤っている時False '******************************************************************* Private Function existTable(ByVal parTableName As String) As Boolean Dim retBool As Boolean 'リターン値 Dim tblName As String Dim existFlg As Boolean For Each tblName In mTableNameList If tblName = parTableName Then retBool = True Exit For End If Next tblName If Not retBool = True Then retBool = False End If Return retBool End Function End Class '--------------- << 独自エラーメッセージ用例外クラス >> -------------- Public Class myDBIOException Inherits ApplicationException Public Sub New(ByVal errorMessage As String) MyBase.New(errorMessage) End Sub End Class ---------------------------------------------------------------------- ■■ 次号予告 第40号(4月24日発行予定) ■■ 1. VB.NETワンポイント 2. データベースアクセスクラスの汎用メソッドについて 9 ====================================================================== VB.NET データベースプログラミング奮闘記 発行者:ウェブ実験室(-----@-----) 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」ホームページに掲載されてい る会社名・製品名等は、各社の登録商標または商標です。 ======================================================================
↑このページ(メルマガ:VB.NETデータベース) 先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.