[pgsql-jp: 29010] Re: libpgvbで、update 結果を知る方法

Hiroshi Saito saito @ inetrt.skcapi.co.jp
2003年 2月 12日 (水) 05:41:50 JST


さいとうです。

言われる前にテストサンプルです。(^_^;)

> VBA+ODBCでもトランザクションの処理はできます。
> いろいろやり方はあるかと思いますが、問題なく使えている方法として
> ダイレクトSQLで処理できています。
> たとえVBAで待たせていてもきちんとトランザクションとして動作します。
> (デッドロックもちゃんとします(^_^;))

<動作確認>
サーバーは、PowerGres1.0β1(PostgreSQL7.3.1)
ODBC は、psqlodbc07-02-0005
Windows2000
Office97(ごめんなさい古くて)

psqlで確認
※VBAでINSERT後(--ここはトランザクションではない。
saito=> select * from saito;
  xxx
-------
 SAITO
(1 row)
※ここはVBAで待たせています。
saito=> update saito set xxx = '更新したよ' where xxx = 'SAITO';
※ここで対象がロックされているので終わるまで帰ってきません。
UPDATE 0
※ここはVBAトランザクションの終了で結局更新できなかったことを
意味しています。
saito=> select * from saito;
  xxx
--------
 したよ
(1 row)


ここからVBA--------------------------------------------------------------
'
' interfaces odbc32.dll api
'
Public Const SQL_NTS = -3
Public Const SQL_HANDLE_ENV = 1&
Public Const SQL_HANDLE_DBC = 2&
Public Const SQL_HANDLE_STMT = 3&

Public Declare Function _
SQLAllocHandle Lib "odbc32.dll" _
    (ByVal handletype As Integer, _
     ByVal inputhandle As Long, _
     ByRef outputhandle As Long) As Integer

Public Declare Function _
SQLAllocEnv Lib "odbc32.dll" _
    (ByRef handle As Long) As Integer

Public Declare Function _
SQLFreeHandle Lib "odbc32.dll" _
    (ByVal handletype As Integer, _
    ByVal handle As Long) As Integer

Public Declare Function _
SQLConnect Lib "odbc32.dll" _
    (ByVal hdbc As Long, _
    ByVal servername As String, _
    ByVal serverlen As Integer, _
    ByVal username As String, _
    ByVal userlen As Integer, _
    ByVal pwd As String, _
    ByVal pwdlen As Integer) As Integer

Public Declare Function _
SQLDisconnect Lib "odbc32.dll" _
    (ByVal hdbc As Long) As Integer

Public Declare Function _
SQLExecDirect Lib "odbc32.dll" _
    (ByVal hstmt As Long, _
    ByVal stmt As String, _
    ByVal stmtlen As Long) As Integer

' 最初にこれでテーブルを作ってね
' create table saito (xxx text primary key);

Private Sub PostgreSQL_Update()

    Dim henv As Long
    Dim hdbc As Long
    Dim hstmt As Long
    Dim rc As Integer

    rc = SQLAllocEnv(henv)
    rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc)
    ' データソースも忘れずに作ってからですよ。
    rc = SQLConnect(hdbc, "PostgreSQL", SQL_NTS, "saito", SQL_NTS, "",
SQL_NTS)

    'INSERT
    rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, hstmt)
    rc = SQLExecDirect(hstmt, _
        "insert into saito values('SAITO');", SQL_NTS)
    rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt)
    rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, hstmt)
    MsgBox "INSERT"
    'UPDATE
    rc = SQLExecDirect(hstmt, "BEGIN;", SQL_NTS)
    rc = SQLExecDirect(hstmt, _
        "update saito set xxx = 'したよ' where xxx = 'SAITO';", SQL_NTS)
    MsgBox "トランザクション内更新中です。他で覗いてみてね。"
    rc = SQLExecDirect(hstmt, "END;", SQL_NTS)
    MsgBox "トランザクションの外にでました。"
    rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt)
    rc = SQLDisconnect(hdbc)
    rc = SQLFreeHandle(SQL_HANDLE_DBC, hdbc)
    rc = SQLFreeHandle(SQL_HANDLE_ENV, henv)

    ' 通常はきちんとエラー対策しないと、とんでもないことになりますよ

End Sub





pgsql-jp メーリングリストの案内