ADODBについて

解決


へなちょこ  2004-02-19 23:45:14  No: 82139  IP: [192.*.*.*]

Win98で動いてたDataGrid+ADODBのプログラムがあるのですが、
これを、Win2000で動かすと、
DataGrid上で変更を加えて、行を変更した時に、
AfterUpdateの中でUpdateメソッドを実行しているのですが、
ここで、「コンシューマーのイベント  ハンドラはプロバイダの再入不可能な
メソッドを呼び出しました」のエラーが出ます。
かなり抽象的な質問ですが、どうかよろしくお願い致します。

編集    削除
岡田 之仁  2004-02-20 00:56:43  No: 82140  IP: [192.*.*.*]

アクセスのDBですか?
ADODBのバージョンは?

ご確認下さい。

以上。

編集    削除
へなちょこ  2004-02-20 18:09:44  No: 82141  IP: [192.*.*.*]

アクセスのDBになります。
アクセスは2000です。
Microsoft Access Driverは、4.00.6200
ADODBのヴァージョンは、2.53.6200.0です。
よろしくお願いします。

編集    削除
岡田 之仁  2004-02-20 18:27:21  No: 82142  IP: [192.*.*.*]

それは、両方のマシンとも同じだったと言うことですか?
ACCESSの場合、Microsoft.Jet.OLEDB.4.0のバージョンも
関係していると思います。
現在は、Microsoft.Jet.OLEDB.4.0 は、SP8 まで出てい
ますので、その辺のご確認を・・・

http://support.microsoft.com/default.aspx?scid=kb;ja;829558
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c
http://www.microsoft.com/japan/technet/treeview/default.asp?url=/japan/technet/security/bulletin/ms04-003.asp

※  VB6 のサービスパックは?
    SP5 ですか?

以上。

編集    削除
岡田 之仁  2004-02-20 18:28:33  No: 82143  IP: [192.*.*.*]

追加・・・

http://support.microsoft.com/default.aspx?scid=kb;ja;189668

この方式で使用されているのですよネ?

以上。

編集    削除
へなちょこ  2004-02-23 18:16:14  No: 82144  IP: [192.*.*.*]

返事が送れて申し訳ありません。
98と2000なのでそういえば、バージョンは違いますね。
98は今はバージョンが確認できません。
それと、98はVB6SP4、2000はVB6SP5です。
ADOの方式は、前のレスにあったとうりにしています。

編集    削除
岡田 之仁  2004-02-23 19:35:23  No: 82145  IP: [192.*.*.*]

こちらの環境でも、Win98が残念ながら無いので確認できません。

尚、VB6のサービスパックは、揃えておいた方が無難です。

ADO のバージョン確認では、VB6 の参照設定で、ADO のバージョン
が表示されていますので、それでわかると思います。

現在、2.8 まで出ていますが、2.7 SP1 が、一般的最新だと思いま
す。セキュリティー等パッチについては、マイクロソフトのサイト
でご確認下さい。

以上。

編集    削除
岡田 之仁  2004-02-23 19:48:32  No: 82146  IP: [192.*.*.*]

をを〜そうか?!

因みに、マイクロソフトのサンプルでは・・・
Provider=Microsoft.Jet.OLEDB.3.51
となっています。が、これは、アクセス97を想定しています。
アクセス2000の場合、
Provider=Microsoft.Jet.OLEDB.4.0
としないと、エラーがでます。

どちらを設定されていますか?

※  外していたらすみません・・・

以上。

編集    削除
へなちょこ  2004-02-24 01:00:38  No: 82147  IP: [192.*.*.*]

すいません。今回の問題のレコードセットをみまちがいしていました。
>この方式で使用されているのですよネ?
は、ADODCコントロールを使用しています。

ADO のバージョンを変えてしまうと今回のAP以外にも
影響を与えてしまう恐れがありですよね?
バージョンを変えないのなら思いっきり書き換えるできでしょうか?

編集    削除
岡田 之仁  2004-02-24 04:55:58  No: 82148  IP: [192.*.*.*]

ADODCでしたか・・・では、争点が違いますネ!〜

調べてみて合致する内容がありましたら、またお知らせします。

以上。

編集    削除
岡田 之仁  2004-02-24 06:39:25  No: 82149  IP: [192.*.*.*]

一応、捕捉・・・

ADODCも内部的にはADODBを呼び出しますので、
参照設定でのADODBのバージョンは影響がある
場合があります。

http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9812/vb6da/

ここの、スクロールした中ほどのに記述があります。

参考までに・・・

※  ADODCは、ADO 2.0 を呼び出すとありますが、参照設定を
    ADO 2.7 とかにして、ADO 2.0 を外せば、当然、ADO 2.7
    での動作になります。
    そうしないとエラーになりますし、ActiveX の意味が無く
    なりますので・・・

以上。

編集    削除
へなちょこ  2004-02-24 18:50:11  No: 82150  IP: [192.*.*.*]

色々ありがとうございます。
なんとか解決できそうな?気がしてきました。
また何かあれば質問させてもらいたいと思います。
ありがとうございました。

編集    削除
魔界の仮面弁士  2004-02-24 20:18:56  No: 82151  IP: [192.*.*.*]

# [解決]マークが付いていますが、一応ゴミレスを。

> それと、98はVB6SP4、2000はVB6SP5です。
可能な限り、SP5を適用してください。(そして、Windows 2000のSP4なども忘れずに)
例えば、VB6SP5を適用していなかった場合、以下のような問題が発生する可能性があります。
http://support.microsoft.com/default.aspx?scid=kb;ja;281887


> ADODBのヴァージョンは、2.53.6200.0です。
これは……[MDAC 2.5 Service Pack 3]ですよね。

VB6 SP3には[MDAC 2.1 SP1a]、VB6 SP4には[MDAC 2.5 (初期版)]、
VB6 SP5には[MDAC 2.6 (初期版)]が同梱されています。

この事を考えると、そのバージョン(2.5 SP3)を使う場合は、
なおさら、VB6SP5にしておいた方が安全だと思いますよ。

特に、MDAC 1.5→2.0、2.0→2.1、2.1→2.5へのバージョンアップの際には、
インターフェイスの変更(拡張)が行われたため、正しい組み合わせで
開発しないと、問題が発生する可能性がある事が知られています。

実際、ADO 2.0→2.1への以降時には、Visual Basic付属のツール
(Visual  Database Tools/Data Environment等)の動作に影響がありました。
(もっとも現在のバージョンでは、この問題は解決されていますけれどね)
http://support.microsoft.com/default.aspx?scid=kb;EN-US;257714
http://support.microsoft.com/default.aspx?scid=kb;JA;257714



--- 以下、ちょっとややこしい話 (回答ではありません) ---

ADOの下位互換性が保たれているのは、主にレイトバインドを選択した場合です。
参照設定で運用する場合は、常に「正しいバージョン」を選択するようにしてください。
(どのバージョンを選択するのが望ましいのかは、ケースバイケースですけれど)

ADOの本体は msado15.dll というファイルですが、古いバージョンへの参照設定を
行った場合、このDLLが直接参照設定されるのではなく、バージョンごとに用意された
msado??.tlb というファイルを経由して参照される事になります。
(どのバージョンのADOでも、最終的に利用されるファイルは msado15.dll です)

このときmsado??.tlb 上においては、古いインターフェイスに対して、
別の名前が付けられる事があります。

例えば、『ADO 2.5』を参照設定している際に、「インターフェイス」を意識した
コーディングを行う必要がある場合には、『Set R = New ADODB.Recordset』というコードで
利用される変数を、「As ADODB.Recordset」と書くのではなく、
  Dim R1 As ADODB.Recordset15    '…1.5相当のRecordset型
  Dim R2 As ADODB.Recordset20    '…2.0相当のRecordset型
  Dim R3 As ADODB.Recordset21    '…2.1相当のRecordset型
  Dim R4 As ADODB.[_Recordset]   '…既定の型(単にADODB.Recordsetと書いた場合は、これに相当)
などのように記述する事がごく稀にあります。

# 上記はRecordsetの場合ですが、Connectionなどにも複数バージョンのインターフェイスがあります。
# また、別のバージョンのADOを参照設定している場合は、別の型定義が必要な場合もあります。
# http://support.microsoft.com/default.aspx?scid=kb;ja;195049


1.5版は、Recordset型の基本インターフェイスとなります。
2.0版は、さらにActiveCommandプロパティなどが追加されています。
2.1版は、さらにIndexプロパティなどが追加されています。
2.5版では、さらにSaveメソッドなどが追加されています。


通常の運用であれば、「ADODB.Recordset」という定義だけで良いのですが、
ADODCなどのように、ADOのデータ型(Recordsetオブジェクトなど)をやりとりする
必要がある場合は、バイナリ互換性を維持しないとエラーとなる事があるため、
クラス名ではなく、インターフェイス名での宣言が必要になる事があります。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;222145
http://support.microsoft.com/default.aspx?scid=kb;JA;222145

編集    削除
へなちょこ  2004-02-24 20:39:49  No: 82152  IP: [192.*.*.*]

レスありがとうございます。一応SP5をあててみます。
大変勉強になりました。

編集    削除