■ExcelVBAで開発
サンプルソースを以下に記載します。接続文字は自分の環境に合わせて変えて下さい。
※[ ]は分かりやすく書いてあるだけで実際はいりません server=192.168.0.1;のようになります。
接続・SQL発行・データ読み込み等のサンプル
Dim myCon As ADODB.Connection
Dim pgRs As ADODB.Recordset
Dim i10 As Long
Dim y10 As Long
'エラーハンドラ
On Error GoTo ODBCErrHandler
Set myCon = New ADODB.Connection
myCon.Open ("Driver={PostgreSQL Unicode};server=[サーバのIPアドレス];Port=[ポート];database=[DB名];username=[ユーザー名];password=[パスワード];")
'トランザクション開始
myCon.BeginTrans
'レコードの追加 ※i10に影響を受けたレコード数がセットされる
myCon.Execute "INSERT INTO cm_item(code, name, price, group_code, group_name) VALUES (7, 'チョコボール', 60, 2, 'チョコ'); ", i10
'データの読込
Set pgRs = New ADODB.Recordset
'SQL発行し、レコードセットに代入
pgRs.Open "select * from cm_item ORDER BY code", myCon, adOpenStatic, adLockReadOnly '静的カーソル,読み取り専用
'SELECTで読込んだレコード数の取得
'MsgBox pgRs.RecordCount
Cells.ClearContents 'セルのクリア
'ヘッダー(項目名)出力
For i10 = 1 To pgRs.Fields.Count
Cells(1, i10).Value = pgRs.Fields(i10 - 1).Name
Next i10
'データを最初から最後まで読込んで各セルに代入する
y10 = 2
Do Until pgRs.EOF 'データを最後まで読み込む
'MsgBox pgRs.Fields("name").Value 'フィールドを指定した値取得
x10 = 0 '横座標カウント用変数クリア
For Each dbCol In pgRs.Fields '項目数
x10 = x10 + 1 '横座標カウントアップ
Cells(y10, x10).Value = dbCol.Value '項目セット
y10 = y10 + 1
pgRs.MoveNext '次のデータを読む
Loop
'レコードセットクローズ
pgRs.Close
'レコードの削除
myCon.Execute "DELETE FROM cm_item WHERE code = 7", i10
'コミット・ロールバック
'myCon.RollbackTrans
myCon.CommitTrans
myCon.Close
Set myCon = Nothing
Exit Sub
ODBCErrHandler:
'エラー処理
If myCon.Errors.Count > 0 Then
MsgBox myCon.Errors(0).Description
Else
MsgBox Err.Number
MsgBox Err.Description
End If
※データベースに接続し、
トランザクションの使用開始
レコードの追加※INSERTコマンドの発行
データの読み込み(Recordset)
読み込んだデータの項目名取得
データ取得
レコードの削除
トランザクションのコミット
一通りの処理を書いてみました。
Excelだけでも結構色々できますね。
■解説
データベースプログラムをする時のお約束
●接続・切断
○接続
まずデータベースに対する接続を行います。ソースの以下の部分です。
Dim myCon As ADODB.Connection
Set myCon = New ADODB.Connection
myCon.Open ("Driver={PostgreSQL Unicode};server=[サーバのIPアドレス];Port=[ポート];database=[DB名];username=[ユーザー名];password=[パスワード];")
データベースのコネクションを定義し、Openします。この時データベースに接続されます。
この時指定する文字列がデータベースとの接続設定になります。
・サーバのIPアドレス :このHPの設定ではCentOSのIPアドレスです。
・ポート :このHPの設定では5432です。これはPostgreSQLのデフォルトの値で変更しておりません。
・DB名 :このHPの設定ではtestdbです。
・ユーザー、パスワード:「データベースのユーザー」です。このユーザーの持っている権限で表等にアクセス出来ます。
○切断
プログラムの最後でデータベースとの接続を切断します。
myCon.Close
Set myCon = Nothing
接続 > SQL発行 > 切断という流れになります。
●SQL発行
○値を返さない物
INSERTやDELETE等データの取得を行わないSQLの実行方法です。
SQLを実行します。ソースは以下の部分です。
Dim i10 As Long
myCon.Execute "INSERT INTO cm_item(code, name, price, group_code, group_name) VALUES (7, 'チョコボール', 60, 2, 'チョコ'); ", i10
myCon.Execute "DELETE FROM cm_item WHERE code = 7", i10
コネクション(今回のサンプルではmyCon)に対してExecuteメソッドを実行する事によってSQLを実行出来ます。
実行する時にSQL文字列と数値型変数を指定する事によってSQLを実行し、結果として影響のあったレコード数が変数に代入されます。
○値を返す物
SELECTでデータを取得する場合です。ソースは以下の部分です。
Dim pgRs As ADODB.Recordset
Set pgRs = New ADODB.Recordset
pgRs.Open "select * from cm_item ORDER BY code", myCon, adOpenStatic, adLockReadOnly
y10 = 2
Do Until pgRs.EOF 'データを最後まで読み込む
x10 = 0 '横座標カウント用変数クリア
For Each dbCol In pgRs.Fields '項目数
x10 = x10 + 1 '横座標カウントアップ
Cells(y10, x10).Value = dbCol.Value '項目セット
y10 = y10 + 1
pgRs.MoveNext '次のデータを読む
Loop
pgRs.Close
データを読み込む時はRecordsetを使います。
pgRs.Open "select * from cm_item ORDER BY code", myCon, adOpenStatic, adLockReadOnly
これでSQLを実行し、その結果がRecordsetに代入されます。
後は最初から1行づつ読む事が出来ます。
●トランザクション
一連の更新をトランザクションにまとめる事によってトランザクション中の処理を
確実に行う、又は全てをキャンセルする事が出来ます。
まず、トランザクションを開始します。
'トランザクション開始
myCon.BeginTrans
次にトランザクションのコミット(完了)、又はロールバック(キャンセル)を行います。
'コミット・ロールバック
'myCon.RollbackTrans
myCon.CommitTrans
コミットを行うと全ての更新が完了します。ロールバックを行うと全ての更新がキャンセルされます。
トップへ戻る