ADOでDB2に接続 OSのバージョンアップすると不具合になる。調査方法の仕方を教えて下さい


ぶたさる  2007-04-27 23:01:20  No: 98669

こんにちは、初めて書きこまさせていただきます
VBでDB2からデータを取得するアプリを老朽化対策の為、新環境にバージョンアップしました。移行したところ新環境でアプリの不具合が起こりました。

ADOでDB接続を行い、CursorLocationをadUseClientにしてあります。
Recordsetからデータを取得してupdata文をなげるロジックがあるのですが、
どうもRecordsetがデータを取得してないみたいです。rs.EOD,rs.BODが両方ともTureになります。
新環境のみで起こります。また、CursorLocationをadUseSeverにすると上手くいく箇所もあります。

いろいろ、原因を調べているのですが、私のスキル不足で分かっていません。
どういう箇所とかを調べればよろしいでしょうか。
よろしくお願いします。

旧環境      新環境
OS:WindowsNT    OS:Windows2003
DB2:Ver7              DB2:Ver8
MDAC:2.5              MDAC:2.8

OLE DBプロバイダーはMicrosoft Jet3.51 OLE DB Provider for ODBC Driversです


もげ  2007-04-28 01:33:43  No: 98670

'確証はありませんが、とりあえず思いついたことを。

>rs.EOD,rs.BODが両方ともTure
rs.EOF と rs.BOF が両方ともTrue  ということでしょうか?
SELECTの条件は正しいですか?

開発環境のVBのバージョンとSPの適用状況はどうなっていますか?
セットアップはどのように行っていますか?
CursorType、LockTypeはどうなっていますか?

>CursorLocationをadUseSeverにすると上手くいく箇所もあります。

上手くいく箇所と上手くいかない箇所にどのような差異がありますか?

>OLE DBプロバイダーはMicrosoft Jet3.51 OLE DB Provider for ODBC Driversです

Jet4.0を使用したら現象に変化はあるでしょうか?

http://support.microsoft.com/kb/271908/ja
とか。


ぶたさる  2007-04-28 03:58:47  No: 98671

返信ありがとうございます。
>rs.EOF と rs.BOF が両方ともTrue  ということでしょうか?
申し訳ありません。スペルを間違えていました。
rs.EOFとrs.BOF共にTrueです。

>SELECTの条件は正しいですか?
正しいです

>開発環境のVBのバージョンとSPの適用状況はどうなっていますか?
開発環境のVBのバージョン:VB6.0でSPはあたっていません

>CursorType、LockTypeはどうなっていますか?
CursorType = adOpenStatic
LockType = adLockOptimistic

>上手くいく箇所と上手くいかない箇所にどのような差異がありますか?
現状の処理を簡単に書いてみました。

Private Const ConnA = "Provider=MSDASQL.1;PassWord=xxxx;Persist Security Info=True;User ID=xxxxx;DataSource=xxxxx"
Private ConnB As ADODB.Connection

Set ConnB = New ADODB.Connection
ConnB.CursorLocation = abUseClient
ConnB.Open ConnA
 
Dim rs     As New ADODB.Recordset
Dim strSql As String

strSql = "Select * from xxxx"

rs.Open strSql, ConnA, adOpenStatic, adLockOptimistic

Do While Not rs.EOF       

    rs!AAA = strData
    rs.Update

    rs.MoveNext
Loop

rs.Close
set rs = Nothing
set ConnA = Nothing

上記の処理を行うと、rs.EOFがTrueで返ってしまうためデータが取得できません。
しかし、CursorLocationをadUseServerに変更するとデータが取得できるようになりましたが、Updateの箇所でエラーになってしまいます。

>Jet4.0を使用したら現象に変化はあるでしょうか?
申し訳ありません。新環境のJetはJet4.0でした。
但し、開発環境はJet3.5でした。


魔界の仮面弁士  2007-04-28 08:58:00  No: 98672

> Microsoft Jet3.51 OLE DB Provider for ODBC Drivers

DB2 と Jet って、関係があるのでしょうか?

ODBC 経由で接続するなら、Jet Provider を使う必要は無く、
[Microsoft OLE DB Provider for ODBC] の "Provider=MSDASQL" で、
DB2 用の(Jet用では無い) ODBC ドライバに接続することになるような…。

で。そもそも ADO で接続するなら、ODBC を経由させるのではなく、
DB2 用の OLE DB Provider を使った方が安全であるような気がします。

[IBM OLE DB Provider for DB2] の "Provider=IBMDADB2" とか、
[Microsoft OLE DB Provider for DB2] の "Provider=DB2OLEDB" とか。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加