[pgsql-jp: 27048] レコードセット作成後のUPDATEについて。(やや、長文です。)

Tsuru.E tsuru @ oita.hht.co.jp
2002年 8月 15日 (木) 19:19:16 JST


お世話になります。
つるつると申します。

メーリングリストに投稿する前に、問題の回避方法は自己解決したのですが、
「なぜ」そうなるのか疑問に思う点が解決出来ないため、投稿させて頂きます。

環境:PostgreSQL7.1.3 , (Access2000 , ADO2.1 , ODBC{7.01.00.05})


現在、DB、フロント共にAccessを個々に用意して動作していたシステムを、
DB側のみ、PostgreSQLを使う、リプレース案件を行っています。

Access側より、キー項目を用いて特定行レコードの、レコードセットを作成し
値を更新したのですが、PostgreSQL側に送られているUPDATE文では、
キー項目により特定されたUPDATE文が実行されていませんでした。
<例1を参照>
−−−
●例1
Dim rst As New ADODB.Recordset, str As String, nNextMode As Integer
str = "SELECT A, B, C FROM hogehoge WHERE KEY=9939"
rst.Open str, conn, adOpenDynamic, adLockOptimistic
−略−
rst![A] = 1
rst.Update   <−ココでPostgreSQLに渡されているSQL文がトレース結果1で
す。
−略−


 ●UPDATEトレース結果1
 -1行が特定されていない。(「KEY」の特定が、Where句に無い)-
 UPDATE hogehoge
 SET A='1'
 WHERE (A='0' AND B='0' AND C IS NULL )
−−−−


上手くUPDATEされないので、Select句にキー項目を増やしレコードセットを
作成した後では、PostgreSQL側に送られているUPDATE文で正しくUPDATE
されます。
<例2を参照>
−−−−
○例2
Dim rst As New ADODB.Recordset, str As String, nNextMode As Integer
str = "SELECT A , B , C , KEY FROM hogehoge WHERE KEY=9939"
rst.Open str, conn, adOpenDynamic, adLockOptimistic
−略−
rst![A] = 1
rst.Update   <−ココでPostgreSQLに渡されているSQL文がトレース結果2で
す。
−略−


 ○UPDATEトレース結果2
 -1行が特定されている。(「KEY=9939」)-
 UPDATE hogehoge
 SET A='1'
 WHERE (A='0' AND B='0' AND C IS NULL AND KEY=9939 )
−−−−

自分の考えでは、例1のレコードセット作成時に、特定の行に対するレコード
セットを作っているので、そのレコードセットに対するUPDATEを掛けた段階で
PostgreSQL側に渡されるUPDATE文に特定の行に対するUPDATE文が、
吐かれて良いのでは?と思ったのですが、なぜ特定行が特定されない
SQL文が吐かれてしまうのか疑問に残ってます。

ご存じの方、御教授頂けないでしょうか?







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