バックナンバー:VB.NETデータベースプログラミング
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第45号】
第45号(2006.8.29発行) ====================================================================== ★★ VB.NETデータベースプログラミング奮闘記 ★★ ---------------------------------------------------------------------- いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中 心に掲載しますので、今後ともよろしくお願い申し上げます。 すぐ使えるADO.NET --> サンプルプログラム満載 http://park5.wakwak.com/‾weblab/ ====================================================================== ■■ VB.NETワンポイント:configファイル ■■ ConnectionStringプロパティに、構成ファイルに設定した接続文字列を指定し て、データベースに接続することもできます。 構成ファイルのファイル名は、アプリケーション名.exe.configになります。 また、構成ファイルは、拡張子exeのあるフォルダにコピーされます。前号の udlファイルとは異なり、ファイルの内容は自動生成されません。中身は、 xml形式で記述する必要があります。 プロジェクトの新しい項目の追加で、アプリケーション構成ファイルを選んで、 新規にファイルを追加すると、次のひな型が自動生成された構成ファイルが作 られます。 <?xml version="1.0" encoding="utf-8" ?> <configuration> </configuration> 生成された<configuration>と</configuration>の間に、<appSettings>要素を 追加します。さらに、<appSettings>要素の中に<add>要素を追加して、key属 性にキー値を、value属性にキー値に対応する値を、文字列として記述します。 たとえば、次のような記述になります。 <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="OleCon" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:¥xxxxx¥bin¥sample.mdb;Persist Security Info=False" /> </appSettings> </configuration> 構成ファイルの設定値の読込むためには、AppSettingsReaderクラスの GetValueメソッドを使用します。 【コーディング例】 Dim con As OleDbConnection Try con = New OleDbConnection() Dim setRead As New Configuration.AppSettingsReader() 'DB接続文字列の設定 con.ConnectionString = _ CType(setRead.GetValue("OleCon", GetType(System.String)), String) 'DB接続を開く con.Open() Catch oExcept As OleDbException Throw New Exception("例外発生" + oExcept.ToString) Catch oExcept As Exception Throw New Exception("例外発生" + oExcept.ToString) Finally 'DB接続を閉じる If Not con Is Nothing Then If con.State = ConnectionState.Open Then con.Close() End If End If End Try End Sub ---------------------------------------------------------------------- ■■ データベースアクセスクラスの汎用メソッドについて 14 ■■ 今号は、社員テーブルのレコードを削除するdeleteRecordメソッドを、 clsDBIOクラスに追加します。引数には、clsDeleteSyainクラスのオブジェク トを指定します。 社員テーブル以外のレコード削除メソッドも、同一名称のdeleteRecordにして、 それぞれのテーブル用の削除のための引数を用意して区別します。 ◆引数のNothing(未設定)チェック 引数が未設定の場合、myDBIOException例外をスローします。 ◆SQL文の構築 更新日時が他で変更されていた場合には、削除できないように、WHERE句で、 "AND 更新日時=@updateDate" の条件を追加しています。@updateDateは、読み 込んだ時の更新日時をセットします。他で変更されていれば、更新日時が一致 しないため、レコードが見つかりません。また、削除されている場合も、見つ かりません。 DELETE FROM 社員テーブル WHERE 社員コード=@sCode AND 更新日時=@updateDate ◆削除処理 トランザクション制御は、レコード追加や更新とまったく同様です。削除する レコードが1レコードでなかった場合には、ロールバックして、削除前の状態 に戻します。WHERE句の条件を複雑にして、複数レコードを削除しないように 注意してください。 削除されたレコード数は、ExecuteNonQueryメソッドの戻り値でわかります。 この戻り値が1以外は、レコード削除の失敗となります。 削除するレコードが1レコードならば、Commitメソッドでトランザクションを 完了します。削除するレコードが1レコードでなかった場合には、 TransactionオブジェクトのRollbackメソッドを使って、それまでの削除処理 をすべてキャンセルして、データベース内のテーブルデータをすべて削除前の 状態に戻します。 '----------------- << データベースアクセスクラス >> ----------------- 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 '**************************************************************************** ' 機能:社員テーブルの1レコードを削除するメソッド ' 引数:clsUpdateSyain型:削除する1レコード分のデータ ' 戻値:integer型:削除したレコード数 '**************************************************************************** Public Function deleteRecord(ByVal parSyain As clsDeleteSyain) As Integer Dim retDeleteCount As Integer 'リターン値 Dim keyList As New Collection() Dim i As Integer Try '★引数チェック If parSyain Is Nothing Then Throw New myDBIOException("引数が未設定") End If '----------<< 1.社員テーブルの1レコードを削除 >>---------- '***** SQL文の設定 ***** mCommand.CommandText = _ "DELETE FROM 社員テーブル " + _ "WHERE 社員コード=@sCode AND 更新日時=@updateDate" '***** SQL文の引数設定 ***** mCommand.Parameters.Clear() mCommand.Parameters.Add _ (New OleDbParameter("@sCode", OleDbType.Char, 5)) mCommand.Parameters.Add _ (New OleDbParameter("@updateDate", OleDbType.Date)) '***** 引数に値を設定 ***** mCommand.Parameters("@sCode").Value = parSyain.pSyainCode mCommand.Parameters("@updateDate").Value = parSyain.pUpdateTime 'DB接続を開く mConn.Open() '***** トランザクション開始 ***** Dim oTrans As OleDbTransaction oTrans = mConn.BeginTransaction mCommand.Transaction = oTrans '***** データベースの削除を実行 ***** retDeleteCount = mCommand.ExecuteNonQuery() If retDeleteCount = 1 Then '***** トランザクション完了 ***** oTrans.Commit() Else '◆レコード削除に失敗したらロールバックして例外スロー oTrans.Rollback() Throw New myDBIOException _ ("社員テーブル:レコード削除処理が失敗しました。") End If Catch oExcept As myDBIOException Throw New myDBIOException(oExcept.Message) Catch oExcept As Exception Throw New Exception _ ("clsDBIOのdeleteRecordで例外発生" + oExcept.ToString) Finally 'DB接続を閉じる If Not mConn Is Nothing Then If mConn.State = ConnectionState.Open Then mConn.Close() End If End If End Try '◆リターン Return retDeleteCount End Function '******************************************************************* ' 機能:キー値のレコードの有無を調べるメソッド ' 引数:テーブル名、キー値 ' 戻値:ある-->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/mag038.html End Function '******************************************************************* ' 機能:テーブル対応の1行を生成するメソッド ' 引数:String型:テーブル名 ' 戻値:DataRow型:生成した行 '******************************************************************* Public Function createDataRow(ByVal parTableName As String) As DataRow '第39号を参照願います。 'http://park5.wakwak.com/‾weblab/mag039.html End Function '******************************************************************* ' 機能:テーブル名をチェックするメソッド ' 引数:String型:テーブル名 ' 戻値:Boolean型:引数のテーブル名が正しい時True、誤っている時False '******************************************************************* Private Function existTable(ByVal parTableName As String) As Boolean '第39号を参照願います。 'http://park5.wakwak.com/‾weblab/mag039.html End Function '******************************************************************* ' 機能:テーブルに1レコードを追加するメソッド ' 引数:clsInsertSyain型:追加する1レコード分のデータ ' 戻値:integer型:追加したレコード数 '******************************************************************* Public Function insertRecord(ByVal parSyain As clsInsertSyain) As Integer '第41号を参照願います。 'http://park5.wakwak.com/‾weblab/mag041.html End Function '**************************************************************************** ' 機能:社員テーブルの1レコードを更新するメソッド ' 引数:clsUpdateSyain型:更新する1レコード分のデータ ' 戻値:integer型:更新したレコード数 '**************************************************************************** Public Function updateRecord(ByVal parSyain As clsUpdateSyain) As Integer '第43号を参照願います。 'http://park5.wakwak.com/‾weblab/mag043.html End Function End Class ---------------------------------------------------------------------- ■■ 次号予告 第46号(9月26日発行予定) ■■ 1. VB.NETワンポイント 2. データベースアクセスクラスの汎用メソッドについて 15 ====================================================================== 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.