psqlODBC+DAOでPostgreSQLに接続する


環境

使用アプリケーション

DB環境

ACCESSの参照設定の状態

 

テストコード

テストコードの入ったMDBファイル

 

  1. JET+パススルークエリ で操作するコード
  2. ODBC Direct で操作するコード

 

テストコード1 JET+パススルークエリ

' JET+ODBC
Public Sub psqlODBCTestJET()
On Error GoTo Err_Syori
    Const connectString As String = "ODBC;DSN=test1;UID=postgres;PWD="
    '(test1はUNICODE)
    '※DSN test1の「charとしてboolsを扱う」オプションをチェックし(psqlODBC Direverの既定値)、
    'ACCESSを再起動してから実行する。
    
    Dim db As Database
    Set db = CurrentDb
    
    'テストテーブル作成
    Dim qdf As QueryDef
    Dim sql As String
    sql = "CREATE TABLE t_pgodbcテスト (" & _
        "id int PRIMARY KEY," & _
        "メモ text," & _
        "はいいいえ bool NOT NULL DEFAULT false," & _
        "日時 timestamp NOT NULL DEFAULT LOCALTIMESTAMP);"
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    Debug.Print "  recordsAffected: ", db.recordsAffected
    'リンクテーブル作成
    Dim tdf As TableDef, tableName As String
    tableName = "t_pgodbcテスト"
    Set tdf = db.CreateTableDef(tableName, 0, tableName, connectString)
    db.TableDefs.Append tdf
    
    
    'テストデータ作成
    Debug.Print ""
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(1, 'あいうえお');"
    Debug.Print "(sql) "; sql
    db.Execute sql
    Debug.Print "  recordsAffected: "; db.recordsAffected
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'かきくけこ');"
    Debug.Print "(sql) "; sql
    db.Execute sql
    Debug.Print "  recordsAffected: "; db.recordsAffected
    '失敗するINSERT文
    On Error Resume Next
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'さしすせそ');"
    Debug.Print "(sql) "; sql
    db.Execute sql
    If Err.Number <> 0 Then
        Debug.Print Err.Number; " "; Err.Description
    End If
    On Error GoTo Err_Syori
    '※psqlODBC Driverの「charとしてboolsを扱う」オプションをチェックしてればWHERE句などで't'の表現が可能
    sql = "INSERT INTO t_pgodbcテスト (id, メモ, はいいいえ) VALUES(3, 'さしすせそ', 't');"
'    sql = "INSERT INTO t_pgodbcテスト (id, メモ, はいいいえ) VALUES(3, 'さしすせそ', true);"
    Debug.Print "(sql) "; sql
    db.Execute sql

    'テストデータ読み込みType1
    Debug.Print ""
    Debug.Print "=====SELECT====="
    Dim rs As Recordset
    sql = "SELECT * FROM t_pgodbcテスト;"
    Debug.Print "(sql) "; sql
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields(0).Name; vbTab; rs.Fields(1).Name; vbTab; rs.Fields(2).Name; vbTab; rs.Fields(3).Name
    Debug.Print "------------------"
    Do Until rs.EOF     'Field_Indexで参照
        Debug.Print rs.Fields(0).Value; vbTab; rs.Fields(1).Value; vbTab; rs.Fields(2).Value; vbTab; rs.Fields(3).Value
        rs.MoveNext
    Loop
    rs.Close
    'JETらしくQUERYで読み込み
    Debug.Print ""
    Debug.Print "=====SELECT QUERY====="
    sql = "SELECT * FROM t_pgodbcテスト;"
    Set qdf = db.CreateQueryDef("", sql)    'MDBに登録しない無名のクエリ
    Debug.Print "(sql) "; sql
    Set rs = qdf.OpenRecordset(dbOpenForwardOnly)
    Debug.Print rs.Fields(0).Name; vbTab; rs.Fields(1).Name; vbTab; rs.Fields(2).Name; vbTab; rs.Fields(3).Name
    Debug.Print "------------------"
    Do Until rs.EOF     'Field_Indexで参照
        Debug.Print rs.Fields(0).Value; vbTab; rs.Fields(1).Value; vbTab; rs.Fields(2).Value; vbTab; rs.Fields(3).Value
        rs.MoveNext
    Loop
    rs.Close
    
    'BOOL条件
    Debug.Print ""
    Debug.Print "=====SELECT WHERE BOOL====="
    '※psqlODBC Driverの「charとしてboolsを扱う」オプションをチェックしてればWHERE句などで't'の表現が可能
    sql = "SELECT * FROM t_pgodbcテスト WHERE はいいいえ='t';"
'    sql = "SELECT * FROM t_pgodbcテスト WHERE はいいいえ=true;"
    Set qdf = db.CreateQueryDef("", sql)    'MDBに登録しない無名のクエリ
    Debug.Print "(sql) "; sql
    Set rs = qdf.OpenRecordset(dbOpenForwardOnly)
    Debug.Print rs.Fields(0).Name; vbTab; rs.Fields(1).Name; vbTab; rs.Fields(2).Name; vbTab; rs.Fields(3).Name
    Debug.Print "------------------"
    Do Until rs.EOF     'Field_Indexで参照
        Debug.Print rs.Fields(0).Value; vbTab; rs.Fields(1).Value; vbTab; rs.Fields(2).Value; vbTab; rs.Fields(3).Value
        rs.MoveNext
    Loop
    rs.Close
    
    
    'テストデータ更新
    Debug.Print ""
    Debug.Print "=====UPDATE====="
    sql = "UPDATE t_pgodbcテスト SET メモ='かかききくくけこ' WHERE id=2;"
    Debug.Print "(sql) "; sql
    db.Execute sql
    Debug.Print "  recordsAffected: "; db.recordsAffected
    '更新確認
    sql = "SELECT count(id) AS 件数 FROM t_pgodbcテスト WHERE メモ='かかききくくけこ';"
    Debug.Print "(sql) "; sql
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
    If Not rs.EOF Then
        Debug.Print "  更新確認件数 "; rs.Fields("件数").Value
    End If
    rs.Close
    'テストデータ読み込みType2
    sql = "SELECT * FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name; vbTab; rs.Fields("はいいいえ").Name; vbTab; rs.Fields("日時").Name
    Debug.Print "------------------"
    Do Until rs.EOF     'Field_Nameで参照
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value; vbTab; rs.Fields("はいいいえ").Value; vbTab; rs.Fields("日時").Value
        rs.MoveNext
    Loop
    rs.Close
        
    'テストデータ削除
    Debug.Print ""
    Debug.Print "=====DELETE====="
    sql = "DELETE FROM t_pgodbcテスト WHERE id=2;"
    Debug.Print "(sql) "; sql
    db.Execute sql
    Debug.Print "  recordsAffected: "; db.recordsAffected
    'テストデータ読み込みType2
    sql = "SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
    
        
    'TRANSACTIONテスト
    Debug.Print ""
    Debug.Print "=====TRANSACTION====="
    Dim jetWorkspace As Workspace
    Set jetWorkspace = Workspaces(0)
    jetWorkspace.BeginTrans
    Debug.Print "BEGIN"
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(10, 'トランザクション内挿入');"
    Debug.Print "(sql) "; sql
    db.Execute sql
    sql = "UPDATE t_pgodbcテスト SET メモ='トランザクション内更新' WHERE id=1;"
    Debug.Print "(sql) "; sql
    db.Execute sql
    sql = "DELETE FROM t_pgodbcテスト WHERE id=3;"
    Debug.Print "(sql) "; sql
    db.Execute sql
    'JET WorkspaceのTransaction内でパススルー
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(20, 'JETトランザクション内でパススルー');"
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString
    qdf.sql = sql
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    Debug.Print "  recordsAffected: ", db.recordsAffected
    'テストデータ読み込みType2
    sql = "SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
    'ROLLBACK
    jetWorkspace.Rollback
    Debug.Print "ROLLBACK"
    'テストデータ読み込みType2
    sql = "SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
    
        
    'nextval()テスト
    Debug.Print ""
    Debug.Print "=====SERIAL====="
    'SERIALテストテーブル作成
    sql = "CREATE TABLE t_pgodbcテスト2 (" & _
        "id serial PRIMARY KEY," & _
        "メモ text);"
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    'リンクテーブル作成
    tableName = "t_pgodbcテスト2"
    Set tdf = db.CreateTableDef(tableName, 0, tableName, connectString)
    db.TableDefs.Append tdf

    '既定値で挿入
    sql = "INSERT INTO t_pgodbcテスト2 (メモ) VALUES('既定値で挿入');"
    Debug.Print "(sql) "; sql
    db.Execute sql
    'nextVal取得
    Dim nextVal As Long
    sql = "SELECT nextval('t_pgodbcテスト2_id_seq');"   '※JETではnextvalを解釈できない
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = True
    Set rs = qdf.OpenRecordset(dbOpenForwardOnly)
    If Not rs.EOF Then
        nextVal = rs.Fields(0).Value
        Debug.Print "  nextVal: "; nextVal
    End If
    rs.Close
    'nextValで挿入
    If nextVal > 0 Then
        sql = "INSERT INTO t_pgodbcテスト2 VALUES(" & nextVal & ", 'nextValで挿入');"
        Debug.Print "(sql) "; sql
        db.Execute sql
    End If
    '確認
    sql = "SELECT id, メモ FROM t_pgodbcテスト2;"
    Debug.Print "(sql) "; sql
    Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
        
        
    'PLpgSql FUNCTION
    Debug.Print ""
    Debug.Print "=====PLpgSql====="
    sql = "CREATE OR REPLACE FUNCTION getmemo(key integer) RETURNS text AS $$ " & _
        "DECLARE memo text;" & _
        "BEGIN" & _
        " SELECT INTO memo メモ FROM t_pgodbcテスト WHERE id=key;" & _
        " RETURN memo;" & _
        "END; $$ LANGUAGE plpgsql;"
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    'FUNCTIOIN 実行
    sql = "SELECT getmemo(3);"      '※JETではgetmemoを解釈できない
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = True
    Set rs = qdf.OpenRecordset(dbOpenForwardOnly)
    Debug.Print rs.Fields(0).Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields(0).Value
        rs.MoveNext
    Loop
    rs.Close
        
        
    '-----後始末
    Debug.Print ""
    Debug.Print "=====後始末====="
    On Error Resume Next
    'リンクテーブル削除
    db.TableDefs.Delete "t_pgodbcテスト"
    db.TableDefs.Delete "t_pgodbcテスト2"
    
    'FUNCTION削除
    sql = "DROP FUNCTION getMemo(integer);"
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    
    'テストテーブル削除
    sql = "DROP TABLE t_pgodbcテスト;"
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    
    sql = "DROP TABLE t_pgodbcテスト2;"
    Debug.Print "(PassThrough_sql) "; sql
    Set qdf = db.CreateQueryDef("")
    qdf.Connect = connectString         'JETで解釈できないSQL文をパススルークエリで処理
    qdf.sql = sql
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    
    Exit Sub
Err_Syori:
    Debug.Print Err.Number; " "; Err.Description
End Sub

テスト結果1 JET+パススルークエリ

(PassThrough_sql) CREATE TABLE t_pgodbcテスト (id int PRIMARY KEY,メモ text,はいいいえ bool NOT NULL DEFAULT false,日時 timestamp NOT NULL DEFAULT LOCALTIMESTAMP);
  recordsAffected:           0 

(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(1, 'あいうえお');
  recordsAffected:  1 
(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'かきくけこ');
  recordsAffected:  1 
(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'さしすせそ');
 3155  ODBC--リンク テーブル 't_pgodbcテスト' への挿入に失敗しました。
(sql) INSERT INTO t_pgodbcテスト (id, メモ, はいいいえ) VALUES(3, 'さしすせそ', 't');

=====SELECT=====
(sql) SELECT * FROM t_pgodbcテスト;
id    メモ    はいいいえ    日時
------------------
 1     あいうえお    0    2005/12/27 11:55:28 
 2     かきくけこ    0    2005/12/27 11:55:28 
 3     さしすせそ    1    2005/12/27 11:55:28 

=====SELECT QUERY=====
(sql) SELECT * FROM t_pgodbcテスト;
id    メモ    はいいいえ    日時
------------------
 1     あいうえお    0    2005/12/27 11:55:28 
 2     かきくけこ    0    2005/12/27 11:55:28 
 3     さしすせそ    1    2005/12/27 11:55:28 

=====SELECT WHERE BOOL=====
(sql) SELECT * FROM t_pgodbcテスト WHERE はいいいえ='t';
id    メモ    はいいいえ    日時
------------------
 3     さしすせそ    1    2005/12/27 11:55:28 

=====UPDATE=====
(sql) UPDATE t_pgodbcテスト SET メモ='かかききくくけこ' WHERE id=2;
  recordsAffected:  1 
(sql) SELECT count(id) AS 件数 FROM t_pgodbcテスト WHERE メモ='かかききくくけこ';
  更新確認件数  1 
(sql) SELECT * FROM t_pgodbcテスト ORDER BY id;
id    メモ    はいいいえ    日時
------------------
 1     あいうえお    0    2005/12/27 11:55:28 
 2     かかききくくけこ    0    2005/12/27 11:55:28 
 3     さしすせそ    1    2005/12/27 11:55:28 

=====DELETE=====
(sql) DELETE FROM t_pgodbcテスト WHERE id=2;
  recordsAffected:  1 
(sql) SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;
id    メモ
------------------
 1     あいうえお
 3     さしすせそ

=====TRANSACTION=====
BEGIN
(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(10, 'トランザクション内挿入');
(sql) UPDATE t_pgodbcテスト SET メモ='トランザクション内更新' WHERE id=1;
(sql) DELETE FROM t_pgodbcテスト WHERE id=3;
(PassThrough_sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(20, 'JETトランザクション内でパススルー');
  recordsAffected:           1 
(sql) SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;
id    メモ
------------------
 1     トランザクション内更新
 10     トランザクション内挿入
 20     JETトランザクション内でパススルー
ROLLBACK
(sql) SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;
id    メモ
------------------
 1     あいうえお
 3     さしすせそ
'※パススルークエリでの追加レコードが残っていそうなもんだが、ROALLBACKされている。

=====SERIAL=====
(PassThrough_sql) CREATE TABLE t_pgodbcテスト2 (id serial PRIMARY KEY,メモ text);
(sql) INSERT INTO t_pgodbcテスト2 (メモ) VALUES('既定値で挿入');
(PassThrough_sql) SELECT nextval('t_pgodbcテスト2_id_seq');
  nextVal:  2 
(sql) INSERT INTO t_pgodbcテスト2 VALUES(2, 'nextValで挿入');
(sql) SELECT id, メモ FROM t_pgodbcテスト2;
id    メモ
------------------
 1     既定値で挿入
 2     nextValで挿入

=====PLpgSql=====
(PassThrough_sql) CREATE OR REPLACE FUNCTION getmemo(key integer) RETURNS text AS $$ DECLARE memo text;BEGIN SELECT INTO memo メモ FROM t_pgodbcテスト WHERE id=key; RETURN memo;END; $$ LANGUAGE plpgsql;
(PassThrough_sql) SELECT getmemo(3);
getmemo
------------------
さしすせそ

=====後始末=====
(PassThrough_sql) DROP FUNCTION getMemo(integer);
(PassThrough_sql) DROP TABLE t_pgodbcテスト;
(PassThrough_sql) DROP TABLE t_pgodbcテスト2;

 

テストコード2 ODBC Direct

' ODBC Direct
Public Sub psqlODBCTestODBCDirect()
On Error GoTo Err_Syori
    Const connectString As String = "ODBC;DSN=test1;UID=postgres;PWD="
    '(test1はUNICODE)
    '※ODBC Directは、DSN test1の「charとしてboolsを扱う」オプションのチェックはどちらもOK。
    '私の好みは、チェックなし。
    'オプションを変更した場合はACCESSを再起動してから実行する。
    
    'postgres ODBC Direct接続
    Dim odbcWorkspace As Workspace
    Set odbcWorkspace = CreateWorkspace("pgworkspace", "", "", dbUseODBC)
    Dim odbcConn As Connection
    Set odbcConn = odbcWorkspace.OpenConnection(Name:="pgdb", Connect:=connectString)

    'テストテーブル作成
    Dim sql As String
    sql = "CREATE TABLE t_pgodbcテスト (" & _
        "id int PRIMARY KEY," & _
        "メモ text," & _
        "はいいいえ bool NOT NULL DEFAULT false," & _
        "日時 timestamp NOT NULL DEFAULT LOCALTIMESTAMP);"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    
    'テストデータ作成
    Debug.Print ""
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(1, 'あいうえお');"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    Debug.Print "  recordsAffected: "; odbcConn.recordsAffected
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'かきくけこ');"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    Debug.Print "  recordsAffected: "; odbcConn.recordsAffected
    '失敗するINSERT文
    On Error Resume Next
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'さしすせそ');"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    If Err.Number <> 0 Then
        Debug.Print Err.Number; " "; Err.Description
    End If
    On Error GoTo Err_Syori
    '※ODBC DirectはJETによるSQL文解釈がないのでbool型本来の書式が可能
    sql = "INSERT INTO t_pgodbcテスト (id, メモ, はいいいえ) VALUES(3, 'さしすせそ', TRUE);"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql

    'テストデータ読み込みType1
    Debug.Print ""
    Debug.Print "=====SELECT====="
    Dim rs As Recordset
    sql = "SELECT * FROM t_pgodbcテスト;"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields(0).Name; vbTab; rs.Fields(1).Name; vbTab; rs.Fields(2).Name
    Debug.Print "------------------"
    Do Until rs.EOF     'Field_Indexで参照
        Debug.Print rs.Fields(0).Value; vbTab; rs.Fields(1).Value; vbTab; rs.Fields(2).Value
        rs.MoveNext
    Loop
    rs.Close
    
    'BOOL条件
    Debug.Print ""
    Debug.Print "=====SELECT WHERE BOOL====="
    '※ODBC DirectはJETによるSQL文解釈がないのでbool型本来の書式が可能
    sql = "SELECT * FROM t_pgodbcテスト WHERE はいいいえ=TRUE;"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields(0).Name; vbTab; rs.Fields(1).Name; vbTab; rs.Fields(2).Name; vbTab; rs.Fields(3).Name
    Debug.Print "------------------"
    Do Until rs.EOF     'Field_Indexで参照
        Debug.Print rs.Fields(0).Value; vbTab; rs.Fields(1).Value; vbTab; rs.Fields(2).Value; vbTab; rs.Fields(3).Value
        rs.MoveNext
    Loop
    rs.Close
    
    'テストデータ更新
    Debug.Print ""
    Debug.Print "=====UPDATE====="
    sql = "UPDATE t_pgodbcテスト SET メモ='かかききくくけこ' WHERE id=2;"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    Debug.Print "  recordsAffected: "; odbcConn.recordsAffected
    '更新確認
    sql = "SELECT count(id) AS 件数 FROM t_pgodbcテスト WHERE メモ='かかききくくけこ';"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    If Not rs.EOF Then
        Debug.Print "  更新確認件数 "; rs.Fields("件数").Value
    End If
    rs.Close
    'テストデータ読み込みType2
    sql = "SELECT * FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name; vbTab; rs.Fields("日時").Name
    Debug.Print "------------------"
    Do Until rs.EOF     'Field_Nameで参照
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value; vbTab; rs.Fields("日時").Value
        rs.MoveNext
    Loop
    rs.Close
        
    'テストデータ削除
    Debug.Print ""
    Debug.Print "=====DELETE====="
    sql = "DELETE FROM t_pgodbcテスト WHERE id=2;"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    Debug.Print "  recordsAffected: "; odbcConn.recordsAffected
    'テストデータ読み込みType2
    sql = "SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
    
        
    'TRANSACTIONテスト
    Debug.Print ""
    Debug.Print "=====TRANSACTION====="
    odbcWorkspace.BeginTrans
    Debug.Print "BEGIN"
    sql = "INSERT INTO t_pgodbcテスト (id, メモ) VALUES(10, 'トランザクション内挿入');"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    sql = "UPDATE t_pgodbcテスト SET メモ='トランザクション内更新' WHERE id=1;"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    sql = "DELETE FROM t_pgodbcテスト WHERE id=3;"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    'テストデータ読み込みType2
    sql = "SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
    'ROLLBACK
    odbcWorkspace.Rollback
    Debug.Print "ROLLBACK"
    'テストデータ読み込みType2
    sql = "SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
    
        
    'nextval()テスト
    Debug.Print ""
    Debug.Print "=====SERIAL====="
    'SERIALテストテーブル作成
    sql = "CREATE TABLE t_pgodbcテスト2 (" & _
        "id serial PRIMARY KEY," & _
        "メモ text);"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql

    '既定値で挿入
    sql = "INSERT INTO t_pgodbcテスト2 (メモ) VALUES('既定値で挿入');"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    'nextVal取得
    Dim nextVal As Long
    sql = "SELECT nextval('t_pgodbcテスト2_id_seq');"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    If Not rs.EOF Then
        nextVal = rs.Fields(0).Value
        Debug.Print "  nextVal: "; nextVal
    End If
    rs.Close
    'nextValで挿入
    If nextVal > 0 Then
        sql = "INSERT INTO t_pgodbcテスト2 VALUES(" & nextVal & ", 'nextValで挿入');"
        Debug.Print "(sql) "; sql
        odbcConn.Execute sql
    End If
    '確認
    sql = "SELECT id, メモ FROM t_pgodbcテスト2;"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields("id").Name; vbTab; rs.Fields("メモ").Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields("id").Value; vbTab; rs.Fields("メモ").Value
        rs.MoveNext
    Loop
    rs.Close
        
        
    'PLpgSql FUNCTION
    Debug.Print ""
    Debug.Print "=====PLpgSql====="
    sql = "CREATE OR REPLACE FUNCTION getmemo(key integer) RETURNS text AS $$ " & _
        "DECLARE memo text;" & _
        "BEGIN" & _
        " SELECT INTO memo メモ FROM t_pgodbcテスト WHERE id=key;" & _
        " RETURN memo;" & _
        "END; $$ LANGUAGE plpgsql;"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    'FUNCTIOIN 実行
    sql = "SELECT getmemo(3);"
    Debug.Print "(sql) "; sql
    Set rs = odbcConn.OpenRecordset(sql, dbOpenForwardOnly)
    Debug.Print rs.Fields(0).Name
    Debug.Print "------------------"
    Do Until rs.EOF
        Debug.Print rs.Fields(0).Value
        rs.MoveNext
    Loop
    rs.Close
        
        
    '-----後始末
    Debug.Print ""
    Debug.Print "=====後始末====="
    On Error Resume Next
    'FUNCTION削除
    sql = "DROP FUNCTION getMemo(integer);"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    
    'テストテーブル削除
    sql = "DROP TABLE t_pgodbcテスト;"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    
    sql = "DROP TABLE t_pgodbcテスト2;"
    Debug.Print "(sql) "; sql
    odbcConn.Execute sql
    
    odbcConn.Close
    odbcWorkspace.Close
    
    Exit Sub
Err_Syori:
    Debug.Print Err.Number; " "; Err.Description
End Sub

 

テスト結果2 ODBC Direct

(sql) CREATE TABLE t_pgodbcテスト (id int PRIMARY KEY,メモ text,はいいいえ bool NOT NULL DEFAULT false,日時 timestamp NOT NULL DEFAULT LOCALTIMESTAMP);

(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(1, 'あいうえお');
  recordsAffected:  1 
(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'かきくけこ');
  recordsAffected:  1 
(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(2, 'さしすせそ');
 3146  ODBC--呼び出しが失敗しました。
(sql) INSERT INTO t_pgodbcテスト (id, メモ, はいいいえ) VALUES(3, 'さしすせそ', TRUE);

=====SELECT=====
(sql) SELECT * FROM t_pgodbcテスト;
id    メモ    はいいいえ
------------------
 1     あいうえお    False
 2     かきくけこ    False
 3     さしすせそ    True

=====SELECT WHERE BOOL=====
(sql) SELECT * FROM t_pgodbcテスト WHERE はいいいえ=TRUE;
id    メモ    はいいいえ    日時
------------------
 3     さしすせそ    True    2005/12/27 12:09:06 

=====UPDATE=====
(sql) UPDATE t_pgodbcテスト SET メモ='かかききくくけこ' WHERE id=2;
  recordsAffected:  1 
(sql) SELECT count(id) AS 件数 FROM t_pgodbcテスト WHERE メモ='かかききくくけこ';
  更新確認件数 1
(sql) SELECT * FROM t_pgodbcテスト ORDER BY id;
id    メモ    日時
------------------
 1     あいうえお    2005/12/27 12:09:06 
 2     かかききくくけこ    2005/12/27 12:09:06 
 3     さしすせそ    2005/12/27 12:09:06 

=====DELETE=====
(sql) DELETE FROM t_pgodbcテスト WHERE id=2;
  recordsAffected:  1 
(sql) SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;
id    メモ
------------------
 1     あいうえお
 3     さしすせそ

=====TRANSACTION=====
BEGIN
(sql) INSERT INTO t_pgodbcテスト (id, メモ) VALUES(10, 'トランザクション内挿入');
(sql) UPDATE t_pgodbcテスト SET メモ='トランザクション内更新' WHERE id=1;
(sql) DELETE FROM t_pgodbcテスト WHERE id=3;
(sql) SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;
id    メモ
------------------
 1     トランザクション内更新
 10     トランザクション内挿入
ROLLBACK
(sql) SELECT id, メモ FROM t_pgodbcテスト ORDER BY id;
id    メモ
------------------
 1     あいうえお
 3     さしすせそ

=====SERIAL=====
(sql) CREATE TABLE t_pgodbcテスト2 (id serial PRIMARY KEY,メモ text);
(sql) INSERT INTO t_pgodbcテスト2 (メモ) VALUES('既定値で挿入');
(sql) SELECT nextval('t_pgodbcテスト2_id_seq');
  nextVal:  2 
(sql) INSERT INTO t_pgodbcテスト2 VALUES(2, 'nextValで挿入');
(sql) SELECT id, メモ FROM t_pgodbcテスト2;
id    メモ
------------------
 1     既定値で挿入
 2     nextValで挿入

=====PLpgSql=====
(sql) CREATE OR REPLACE FUNCTION getmemo(key integer) RETURNS text AS $$ DECLARE memo text;BEGIN SELECT INTO memo メモ FROM t_pgodbcテスト WHERE id=key; RETURN memo;END; $$ LANGUAGE plpgsql;
(sql) SELECT getmemo(3);
getmemo
------------------
さしすせそ

=====後始末=====
(sql) DROP FUNCTION getMemo(integer);
(sql) DROP TABLE t_pgodbcテスト;
(sql) DROP TABLE t_pgodbcテスト2;

ミドルウエア一覧へ戻る