こんにちは、初めて書きこまさせていただきます
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です
'確証はありませんが、とりあえず思いついたことを。
>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
とか。
返信ありがとうございます。
>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でした。
> 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" とか。
ツイート | ![]() |