バックナンバー:VB.NETデータベースプログラミング
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第43号】
第43号(2006.7.5発行)
======================================================================
★★ VB.NETデータベースプログラミング奮闘記 ★★
----------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中
心に掲載しますので、今後ともよろしくお願い申し上げます。
すぐ使えるADO.NET --> サンプルプログラム満載
http://park5.wakwak.com/‾weblab/
======================================================================
■■ VB.NETワンポイント:現在の日時 ■■
主要なDBMSでは、SQL文に、現在の日時を取得するために、ANSIで規定されて
いるCURRENT_TIMESTAMP関数を利用することができます。
【SQL文記述例】
UPDATE 社員テーブル
SET 社員氏名=@sSimei, 社員カナ=@sKana, 更新日時=CURRENT_TIMESTAMP
WHERE 社員コード=@sCode AND 更新日時=@updateDate
clsDBIOクラスのupdateRecordメソッドでは、now()関数を使っています。
UPDATE 社員テーブル
SET 社員氏名=@sSimei, 社員カナ=@sKana, 更新日時=now()
WHERE 社員コード=@sCode AND 更新日時=@updateDate
clsDBIOクラスのinsertRecordメソッドでは、現在の日時をプログラムで取得
して、SQL文の引数に日付データを渡していました。
mCommand.CommandText = _
"UPDATE 社員テーブル " + _
"SET 社員氏名=@sSimei, 社員カナ=@sKana, 更新日時=@newUpdateDate " + _
"WHERE 社員コード=@sCode AND 更新日時=@updateDate"
:
mCommand.Parameters.Add _
(New OleDbParameter("@newUpdateDate", OleDbType.Date))
:
mCommand.Parameters("@newUpdateDate").Value = Now()
CURRENT_TIMESTAMP関数が利用できる場合には、DBMS独自の関数は使わないほ
うが良いでしょう。
----------------------------------------------------------------------
■■ データベースアクセスクラスの汎用メソッドについて 12 ■■
今号は、社員テーブルのレコードを更新するupdateRecordメソッドを、
clsDBIOクラスに追加します。引数には、clsUpdateSyainクラスのオブジェク
トを指定します。
社員テーブル以外のレコード更新メソッドも、updateRecordと同一名称にして、
それぞれのテーブル用の引数を用意して区別します。
◆引数のNothing(未設定)チェック
引数が未設定の場合、myDBIOException例外をスローします。
◆SQL文の構築
更新日時が他で変更されていた場合には、更新できないように、WHERE句で、
"AND 更新日時=@updateDate" の条件を追加しています。@updateDateは、読み
込んだ時の更新日時をセットします。他で変更や削除されていれば、更新日時
が一致しないため、レコードが見つかりません。レコード更新用のSQL文は次
のようになります。
UPDATE 社員テーブル SET 社員氏名=@sSimei, 社員カナ=@sKana, 更新日時=now()
WHERE 社員コード=@sCode AND 更新日時=@updateDate"
◆更新処理
トランザクション制御は、レコード追加のinsertRecordメソッドとまったく同
様です。更新するレコードが1レコードでなかった場合には、ロールバックし
て、更新前の状態に戻します。
Dim oTrans As OleDbTransaction
oTrans = mConn.BeginTransaction
mCommand.Transaction = oTrans
更新されたレコード数は、ExecuteNonQueryメソッドの戻り値でわかります。
この戻り値が1以外は、レコード更新の失敗となります。
retInsertCount = mCommand.ExecuteNonQuery()
更新するレコードが1レコードならば、Commitメソッドでトランザクションを
完了します。
oTrans.Commit()
更新するレコードが1レコードでなかった場合には、Transactionオブジェクト
のRollbackメソッドを使って、それまでの変更処理をすべてキャンセルして、
データベース内のテーブルデータをすべて変更前の状態に戻します。
oTrans.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 updateRecord(ByVal parSyain As clsUpdateSyain) As Integer
Dim retUpdateCount 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 = _
"UPDATE 社員テーブル " + _
"SET 社員氏名=@sSimei, 社員カナ=@sKana, 更新日時=now() " + _
"WHERE 社員コード=@sCode AND 更新日時=@updateDate"
'***** SQL文の引数設定 *****
mCommand.Parameters.Clear()
mCommand.Parameters.Add _
(New OleDbParameter("@sSimei", OleDbType.Char, 20))
mCommand.Parameters.Add _
(New OleDbParameter("@sKana", OleDbType.Char, 40))
mCommand.Parameters.Add _
(New OleDbParameter("@sCode", OleDbType.Char, 5))
mCommand.Parameters.Add _
(New OleDbParameter("@updateDate", OleDbType.Date))
'***** 引数に値を設定 *****
mCommand.Parameters("@sSimei").Value = parSyain.pSyainSimei
mCommand.Parameters("@sKana").Value = parSyain.pSyainKana
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
'***** データベースの更新を実行 *****
retUpdateCount = mCommand.ExecuteNonQuery()
If retUpdateCount = 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のupdateRecordで例外発生" + 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 retUpdateCount
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
End Class
----------------------------------------------------------------------
■■ 次号予告 第44号(8月1日発行予定) ■■
1. VB.NETワンポイント
2. データベースアクセスクラスの汎用メソッドについて 13
======================================================================
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.