バックナンバー: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.