トランザクションと言えば、やはりこの本。
未だ買ってすらいない。 パタッ(o_ _)o~†
昔からデータベースのこの辺がチンプンカンプン。入門レベルを読んでもトランザクション、排他制御になるとついていけない。いつかはちゃんと頭の中を整理したいのだけれど… (+_+)
クライアントから見たトランザクション
トランザクションの大枠については以下の図を参照。
異常なければコミット、異常があればロールバック。これだけ聞くとシンプルなのだけれど…。とりあえず、クライアントアプリがトランザクションを利用するときのテンプレートを書いておくことに。参考にしたのは以下の二つの記事。
Access の ADO については、「ActiveX Data Object : ADO入門講座」を。
テンプレート
以下、ADO でテーブルにレコードを追加するときのテンプレート。Java のように try ~ catch がないのでエラーハンドラと Resume を利用。
ポイントは、トランザクションが開始された後に異常が置きたらロールバック。正常異常を問わず、最後にデータベースへのコネクションを閉じる。ただし、その際コネクションが存在していることを確認すること。
Sub tmplADOTran() On Error GoTo Err_Handler Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim blnTran As Boolean blnTran = False Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset ' トランザクションの開始 cn.BeginTrans ' blnTran = True rs.Open "テーブル名", cn, adOpenKeyset, adLockOptimistic ' データを列ごとに追加する rs.addnew rs!列名 = "値" rs.Update ' コミット cn.CommitTrans blnTran = False Finally: If Not rs Is Nothing Then rs.Close If Not rs Is Nothing Then cn.Close Exit Sub Err_Handler: ' ロールバック If blnTran Then cn.RollbackTrans MsgBox "エラーが発生しました: " & Err.Description, vbOKOnly Resume Finally End Sub
あぁ~、何かややこしいなぁ。 (+_+)
例. CSV ファイルのデータを登録
上記のテンプレートを元に、CSV ファイル (test.csv) のデータをテーブルに登録するコードを書いてみる。ただし、対象のテーブルは一つ。追加する先のテーブルの列は文字列型とする。
まず、データを追加するテーブルの名称と列の名前を保持する Table クラスを作成。(挿入 > クラスモジュール) 値を保持するだけなのでインスタンス変数は Public に。
Public name As String ' テーブルの名称 Public cols As New Collection ' 列の名前のコレクション
上記のテーブル情報を持ったオブジェクトと、データ元となるファイルへのパスを渡すとレコードを追加する関数は以下のようになる。
Sub insert(objTbl As table, strFilePath As String) On Error GoTo Err_Handler Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim blnTran As Boolean Dim fileNo As Integer Dim idx As Integer blnTran = False Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset ' トランザクションの開始 cn.BeginTrans ' blnTran = True rs.Open objTbl.name, cn, adOpenKeyset, adLockOptimistic ' CSV ファイルからデータを一行ずつ読み込む fileNo = FreeFile() Open strFilePath For Input As #fileNo Do Until EOF(fileNo) Line Input #fileNo, strLine strAry = Split(strLine, ",") ' データを列ごとに追加する rs.addnew idx = 0 For Each col In objTbl.cols rs(col) = strAry(idx) idx = idx + 1 Next rs.Update Loop Close #intFileNo ' コミット cn.CommitTrans blnTran = False Finally: If Not rs Is Nothing Then rs.Close If Not rs Is Nothing Then cn.Close Exit Sub Err_Handler: ' ロールバック If blnTran Then cn.RollbackTrans MsgBox "エラーが発生しました: " & Err.Description, vbOKOnly Resume Finally End Sub
上記を例えば次のように呼ぶ。
Sub test() Dim objTbl As New table Dim filePath As String ' CSV ファイルのパス filePath = Application.CurrentProject.Path & "\test.csv" objTbl.name = "テーブル名" ' データを追加するテーブルの名前 objTbl.cols.Add "列名" ' データを追加するテーブルの列の名前 insert objTbl, filePath End Sub
0コメント:
コメントを投稿