[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/10/27(Wed) 11:55
投稿者名:はこ
Eメール:
URL :
タイトル:
DataGridについて
これまで以下のような方法で、Access97で作られたデータベースを
DataGridで表示させていました。

Dim DB As ADODB.Connection
Dim rs1 As ADODB.Recordset

Set DB = New ADODB.Connection
DB.ConnectionString = "Provider=Microsoft.Jet.oledb.3.51;data source = DB01.mdb"
DB.Open

Set rs1 = New ADODB.Recordset
rs1.Open "TBL01", DB, adOpenStatic, adLockOptimistic
Set DataGrid1.DataSource = rs1

このたびデータベースをAccess97→Access2000にバージョンアップ
したので、ソースを以下のように変更しました。

(変更前)
DB.ConnectionString = "Provider=Microsoft.Jet.oledb.3.51;data source = DB01.mdb"

(変更後)
DB.ConnectionString = "Provider=Microsoft.Jet.oledb.4.0;data source = DB01.mdb"

すると、これまでちゃんと表示されていたデータが1件も
表示されなくなってしまいました。
(テーブルの構造、データ件数などは変わっていません)

エラーが発生しているというわけではなく、ウォッチリストでrs1と
DataGrid1のプロパティを見てみると、rs1のFieldsオブジェクトには
ちゃんと各フィールドのデータが入っているのですが、DataGrid1の
Columnsオブジェクトにはデータが入っていませんでした。

VBの参照設定でこれまでは「Microsoft AcriveX Data Objects 2.0 Library」
を参照していましたが、「Microsoft ActiceX Data Objects 2.7 Library」
に変更しても同じ現象になってしまいます。

MDBファイルをAccess97形式に戻しても、同じ現象になってしまいます。

もしかしてJetのバージョン4.0が対応していない、なんてことが
あるのでしょうか?

お分かりになる方がいらっしゃいましたら、ご教授ください。
宜しくお願いします。

<開発環境>
WindowsXP SP1
VisualBasic6.0 SP5

投稿時間:2004/10/27(Wed) 12:43
投稿者名:KIM.J
Eメール:
URL :
タイトル:
Re: DataGridについて
> Set rs1 = New ADODB.Recordset
> rs1.Open "TBL01", DB, adOpenStatic, adLockOptimistic
> Set DataGrid1.DataSource = rs1

  rs1.Properties("IRowsetIdentity") = True と付け加えてみてください。
 カーソルの指定も影響するかもしれませんが。。。

投稿時間:2004/10/27(Wed) 13:29
投稿者名:はこ
Eメール:
URL :
タイトル:
Re^2: DataGridについて
KIM.Jさん

ご回答ありがとうございます。
教えていただいた方法で、次のようにしてみました。

Set rs1 = New ADODB.Recordset
Set rs1.ActiveConnection = DB
rs1.Properties("IRowsetIdentity") = True
rs1.Open "TBL101", DB, adOpenStatic, adLockOptimistic

ですがやはり現象は同じでした。
他にも何か原因がありますでしょうか?

投稿時間:2004/10/27(Wed) 16:04
投稿者名:yuta
Eメール:
URL :
タイトル:
Re^3: DataGridについて
はじめまして。

> Set rs1 = New ADODB.Recordset
> Set rs1.ActiveConnection = DB
> rs1.Properties("IRowsetIdentity") = True
> rs1.Open "TBL101", DB, adOpenStatic, adLockOptimistic
>
> ですがやはり現象は同じでした。
> 他にも何か原因がありますでしょうか?

rs1.Openのところをバラバラに設定してみてはどうでしょうか?
----------------------------------------------------------------------------------------------
Set rs1 = New ADODB.Recordset

rs1.Source = "TBL101"
rs1.ActiveConnection = DB
rs1.CursorType = adOpenStatic
rs1.LockType = adLockOptimistic
rs1.Properties("IRowsetIdentity") = True
rs1.Open

'データグリッドに連結
DataGrid1.DataSorce = rs1
----------------------------------------------------------------------------------------------
このように私は記述しています。参考になれば幸いです。

投稿時間:2004/10/27(Wed) 17:24
投稿者名:はこ
Eメール:
URL :
タイトル:
Re^4: DataGridについて
yutaさん

ご回答ありがとうございます。

教えていただいた方法でばっちりうまくいきました!
もしかしてバージョンアップの際、RecordsetのOpenメソッドの
パラメータの順番でも変わったのでしょうか。
そこまではまだ未確認ですが、ひとまずご報告まで。

どうもありがとうございました。

投稿時間:2004/10/28(Thu) 11:28
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Recordsetの作成に関して
> Set rs1.ActiveConnection = DB
> rs1.Properties("IRowsetIdentity") = True
> rs1.Open "TBL101", DB, adOpenStatic, adLockOptimistic

このように書いた場合、その前に書かれた接続設定は無視されます。

まず、Propertiesプロパティで設定される「ダイナミック プロパティ」ですが、
これは接続対象となる OLE DB Provider によって、指定可能な項目が異なるのです。
そのため、Properties を指定する前には、ActiveConnection プロパティ等にて、
適切な Connection を割り当てておく必要があります。


ところが、はこさんのコードの場合、Properties を指定したまでは良かったのですが、
最後の Open メソッドの呼び出し部分に問題があったのです。

今回の場合、最後の Open メソッドにて Connection を再度割り当てたたため、
直前の Properties プロパティの設定がリセットされてしまった事になります。

例えばこれが、
   Set rs1.ActiveConnection = DB
   rs1.Properties("IRowsetIdentity").Value = True
   rs1.Open "Table1", DB, adOpenStatic, adLockOptimistic
ではなく、
   Set rs1.ActiveConnection = DB
   rs1.Properties("IRowsetIdentity").Value = True
   rs1.Open "Table1", , adOpenStatic, adLockOptimistic
のように書かれていれば、事前の接続設定(ActiveConnection) はリセットされません。
(Open時に、ActiveConnectionの設定を省略してある事に注意してください)


なお、No.716 (yutaさん)のコードについては、ActiveConnection に加えて、
CursorType と LockType の指定も分けて記述した形式ですね。


ちなみに、DataGrid に反映させるためには、IRowsetIdentity を指定する以外にも、
「Rs1.CursorLocation = adUseClient」の指定を行う事でも実現できます。
adUseClient が指定されている場合は、IRowsetIdentity を指定せずにも表示されます。
No.713 (KIM.Jさん) の投稿にて『カーソルの指定も影響するかもしれませんが』と
書かれていますが、これは、この CursorLocation の設定の事を意味しています。

# なお、Recordsetに CursorLocationの指定が無い場合は、Connectionオブジェクト側の
# CursorLocation の設定が利用される事になります。

投稿時間:2004/10/29(Fri) 08:05
投稿者名:はこ
Eメール:
URL :
タイトル:
Re: Recordsetの作成に関して
魔界の仮面弁士さん

お礼が遅くなってしまってすみません。
魔界の仮面弁士さんの情報にはいつもいろいろなところでお世話になっています。
どうもありがとうございます。

> 今回の場合、最後の Open メソッドにて Connection を再度割り当てたたため、
> 直前の Properties プロパティの設定がリセットされてしまった事になります。

今までOpenメソッドはただデータベースに接続するだけだと思っていました。
プロパティの設定関係は全てクリアされてしまうのですね。
ただJet 3.51を使用していたときは、この方法で接続していましたので、Jet 4.0
からの仕様(?)ということでしょうか。

各プロパティについても、これまではおまじないのようにいつも同じように記述
しているだけでしたので、今回のことでだいぶ詳しくなれました。
どうもありがとうございました。

投稿時間:2004/10/29(Fri) 18:38
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: Recordsetの作成に関して
> 今までOpenメソッドはただデータベースに接続するだけだと思っていました。
> プロパティの設定関係は全てクリアされてしまうのですね。

クリアされる、というよりは、再定義されるようなイメージですかね。
Recordset.Open時の各引数を指定すると、
  第1引数:Source           … Sourceプロパティ、ActiveCommandプロパティ等に相当
  第2引数:ActiveConnection … ActiveConnectionプロパティに相当
  第3引数:CursorLocation   … ACursorLocationプロパティに相当
  第4引数:LockType         … LockTypeプロパティに相当
のように、同名のプロパティを上書きするイメージになりますので。


引数を全て省略すれば、前回の設定が引き継がれますので、
    RS.Open "table1", Cn, adOpenKeyset, adLockOptimistic
    RS.Close
    RS.Properties("IRowsetIdentity").Value = True
    RS.Open       '★引数無し
のようなコードも書けたりします。


> ただJet 3.51を使用していたときは、この方法で接続していましたので、Jet 4.0
> からの仕様(?)ということでしょうか。
何故か、そういう仕様になってしまったようです。(^^;)

なお、今回の件に関しては、下記で報告されています。
hhttp://support.microsoft.com/default.aspx?scid=kb;ja;224192

投稿時間:2004/11/01(Mon) 12:43
投稿者名:はこ
Eメール:
URL :
タイトル:
Re^3: Recordsetの作成に関して
魔界の仮面弁士さん

更なる情報どうもありがとうございます。

DataGridに表示されなくなった直接的な原因は、"IRowsetIdentity"
プロパティを追加しなければいけなかったからなんですね!

「なんで接続方法を変えただけで表示されるようになったの??」
と疑問に思っていたのですが、教えていただいたURLを参考にして
やっとわかりました。

お礼が遅れて申し訳ありません。
どうもありがとうございました。