[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 メーリングリストの案内