[リストへもどる]
一括表示

投稿時間:2002/12/10(Tue) 19:45
投稿者名:かとちゃん
URL :
タイトル:
ADOのコネクション処理について
お世話になります
今まではVB5で作成していましたが
VB6でのADOにチャレンジしています。
ADOのコネクション確立に3分もかかってしまいます。
DBは Access97 JET mdb です。
ネットワーク上にあるサーバにアクセスしています
Access2000のmdbにすれば解決する物でしょうか?
ご指導をお願いいたします。

投稿時間:2002/12/11(Wed) 13:16
投稿者名:通行人A
Eメール:
URL :
タイトル:
Re: ADOのコネクション処理について
はじめまして。

> ADOのコネクション確立に3分もかかってしまいます。
> DBは Access97 JET mdb です。

mdbを使用するのであればDAOにするのが一番良いかと思います。
SQL ServerなんかだとADO、RDOで問題ないのですが・・・

> Access2000のmdbにすれば解決する物でしょうか?

解決しないでしょう。MSDEを使用されてはいかがですか?
SQL Serverとほぼ同じレスポンスで動作しますよ

投稿時間:2002/12/11(Wed) 14:35
投稿者名:かとちゃん
URL :
タイトル:
Re^2: ADOのコネクション処理について
> はじめまして。
>
> > ADOのコネクション確立に3分もかかってしまいます。
> > DBは Access97 JET mdb です。
>
> mdbを使用するのであればDAOにするのが一番良いかと思います。
> SQL ServerなんかだとADO、RDOで問題ないのですが・・・
>
> > Access2000のmdbにすれば解決する物でしょうか?
>
> 解決しないでしょう。MSDEを使用されてはいかがですか?
> SQL Serverとほぼ同じレスポンスで動作しますよ

ご指導ありがとうございます
そうすると、VB6でADOを使う場合、対象はMSDEかSQL Serverとゆうことになるのでしょうか
対象がmdbの場合、VB6ではDAOを使うべきの判断でいいのでしょうか?

投稿時間:2002/12/11(Wed) 18:25
投稿者名:takk
Eメール:takk_neo@hotmail.com
URL :
タイトル:
Re^3: ADOのコネクション処理について
> ご指導ありがとうございます
> そうすると、VB6でADOを使う場合、対象はMSDEかSQL Serverとゆうことになるのでしょうか
> 対象がmdbの場合、VB6ではDAOを使うべきの判断でいいのでしょうか?

参考にならないかもしれませんが……。

僕は(ネットワーク上の)mdbでもADOを使っていますが、
コネクション処理でそんなに遅くなったことはありませんよ。

ローカルのmdbでもそんなに遅かったりするのでしょうか?
もしネットワーク上のmdbだけ処理が遅いんであれば
LANボード、ケーブル、ハブ等を疑った方が良いかも(よく知りませんが…)。

また、ローカルのmdbでも時間が掛かるなら……なんだろ?
CPUのスピードとかConnectionStringを確認した方が良いのかもしれませんね。

投稿時間:2002/12/11(Wed) 18:35
投稿者名:通行人A
Eメール:
URL :
タイトル:
Re^3: ADOのコネクション処理について
> そうすると、VB6でADOを使う場合、対象はMSDEかSQL Serverとゆうことになるのでしょうか
> 対象がmdbの場合、VB6ではDAOを使うべきの判断でいいのでしょうか?


ADOとMDBの組み合わせは以下の不具合等が発生するようです。
でもMSDE、もしくはSQL Serverに変更するのもロジックの修正が多々発生すると
思われますので、私ならDAOを使うかな(^^;
まあ絶対使ってはダメってことはないですよ。

1) Likeを使ったあいまい検索ができない
2) Do 〜 Loopの中で更新を行うとシステムエラー?が発生する
3) レコードを追加した後オートナンバーが取得できない

※ADO2.5で改善されているかもしれませんm(__)m

投稿時間:2002/12/12(Thu) 12:56
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: ADOのコネクション処理について
> > そうすると、VB6でADOを使う場合、対象はMSDEかSQL Serverとゆうことになるのでしょうか
SQL Serverとの親和性が高いのは確かですが、別にADOはそもそもデータベース接続用と
いうわけではなく、もっと汎用的なデータ操作オブジェクトです。
データベース以外…例えば、メモリ上にもったデータを扱う事もできますし(standalone-recordset)、
Webにファイルをアップロードしたりダウンロードしたりする事もできます(Internet Publishing Provider)。


> > 対象がmdbの場合、VB6ではDAOを使うべきの判断でいいのでしょうか?
処理としてはDAOの方が高速ですが、気になるほどの差が生じる事は稀です。

ADOでしかできない事やDAOでしかできない事もありますので、ケースバイケースではありますが、
現在ADOで作っているものを、わざわざDAOに置き換える程の事は無いと思いますよ。


> 1) Likeを使ったあいまい検索ができない
いいえ、可能ですよ。(^^;)

ただし、DAO 3.6は、ANSI SQL-89構文を使用していますが、JET 4.0プロバイダは、
ANSI SQL-92構文を利用しているため、ワイルドカード文字は異なります。
具体的には、SQL-89モードでは、*, ?等を利用しますが、SQL-92モードでは、%, _等を利用する事になります。

SQL-89は、MS-DOS互換のワイルドカード表現ですが、ADO(というか Jet 4.0 OLE DB Provider)で
採用されているSQL-92構文では、OracleやMSDEなどの、一般的なRDBMSに近い構文になったわけですね。
(なお、[]や#などの表現は、どちらのモードでも利用する事ができます)

ちなみに、Microsoft Access 2002では、オプション設定を変更する事で、
クエリ画面でANSI SQL-89モードを使うか、92を使うかを指定できるようになっています。


> 2) Do 〜 Loopの中で更新を行うとシステムエラー?が発生する
当方では経験していないので、この件について具体的に教えていただけないでしょうか?


> 3) レコードを追加した後オートナンバーが取得できない
コーディングに問題があるのでは無いでしょうか。
当方で実験したところ、「FieldオブジェクトのValueプロパティ」でも、
「"SELECT @@IDENTITY"クエリ」でも、問題なく取得できましたが。。。

'ファイル名: C:\db1.mdb
'テーブル名: TABLE
'第1列: ID=オートナンバー(主キー)
'第2列: DATA=テキスト型(長さ=50)

    Dim Cn As ADODB.Connection
    Dim RS As ADODB.Recordset

    Set Cn = New ADODB.Connection
    Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    Cn.Open "C:\db1.mdb"

    Set RS = New ADODB.Recordset
    RS.Open "TABLE", Cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect

    RS.AddNew
    RS.Fields("DATA").Value = "1行目"
    RS.Update
    Debug.Print RS.Fields("ID").Value
    MsgBox Cn.Execute("SELECT @@IDENTITY").Collect(0)

    RS.AddNew
    RS.Fields("DATA").Value = "2行目"
    RS.Update
    Debug.Print RS.Fields("ID").Value
    MsgBox Cn.Execute("SELECT @@IDENTITY").Collect(0)

    RS.AddNew "DATA", "3行目"
    RS.AddNew "DATA", "4行目"
    RS.AddNew "DATA", "5行目"
    Debug.Print RS.Fields("ID").Value
    MsgBox Cn.Execute("SELECT @@IDENTITY").Collect(0)

投稿時間:2002/12/12(Thu) 15:42
投稿者名:通行人A
Eメール:
URL :
タイトル:
Re^5: ADOのコネクション処理について

> > 1) Likeを使ったあいまい検索ができない
> ただし、DAO 3.6は、ANSI SQL-89構文を使用していますが、JET 4.0プロバイダは、
> ANSI SQL-92構文を利用しているため、ワイルドカード文字は異なります。
> 具体的には、SQL-89モードでは、*, ?等を利用しますが、SQL-92モードでは、%, _等を利用する事になります。

> > 2) Do 〜 Loopの中で更新を行うとシステムエラー?が発生する

> > 3) レコードを追加した後オートナンバーが取得できない

すみません(^^;
全て再確認(ADO2.5)しましたらできました。
1)については初めて知りました。以前の記憶(2、3年前?)で書きこんでしまいました(^^;

本題に戻りますが、Access97・2000でコネクションしてもたいして時間はかかりませんでした。
やっぱネットワーク環境?

投稿時間:2002/12/12(Thu) 13:47
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: ADOのコネクション処理について
> ADOのコネクション確立に3分もかかってしまいます。
mdbのサイズはどのくらいでしょうか?

> ネットワーク上にあるサーバにアクセスしています
ネットワーク上でmdbファイルを使う場合、いくつかの注意点があります。
こちらを参照してみてください。
http://support.microsoft.com/default.aspx?scid=kb;ja;300216


> Access2000のmdbにすれば解決する物でしょうか?
とりあえず、やってみるのが一番でしょうね。
もし、Access 2000をお持ちで無ければ、以下のようにすれば変換できます。

'Kill "C:\Ac2k.mdb
Src = "Provider=Microsoft.Jet.OLEDB.4.0;" _
    & "Data Source=C:\Ac97.mdb;Jet OLEDB:Engine Type=4;" _
    & "Locale Identifier=0x00000411
Dsc = "Provider=Microsoft.Jet.OLEDB.4.0;" _
    & "Data Source=C:\Ac2k.mdb;Jet OLEDB:Engine Type=5;" _
    & "Locale Identifier=0x00000411
CreateObject("JRO.JETEngine").CompactDatabase Src, Dsc


# なお、上記のコードでは、mdbのバージョンを「JET 4.0形式へ変換する」事はできますが、
# 「Access 97で作成された」という内部情報までは書きかわりません。内部情報までを
# 変更したいのであれば、Access 2000を使って変換するか、DAO 3.6を使って、
# Database.Properties("AccessVersion").Value を書き換える必要があります。

投稿時間:2002/12/12(Thu) 19:33
投稿者名:かとちゃん
URL :
タイトル:
Re^2: ADOのコネクション処理について
みなさん大変お世話になっております。
ネットワーク上にある300kほどのmdbで有りながら
以下のフォームをロードする際、フォームが画面に出てくるまでに3分程度待ちます。
ご指摘の通り、社内ネットワークで2つHUB越しではありますが
DAOですとすんなり開けるのですが、ADOの場合ダメです。
ご指導のほどよろしくお願いいたします。

Private Sub Form_Load()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim rs2 As ADODB.Recordset
    Dim rs3 As ADODB.Recordset
    Dim rs4 As ADODB.Recordset

    Set cn = New ADODB.Connection
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                        & "Data Source=" & "c:\aaa.mdb"
    cn.Open
    ' レコードセットを取得
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open "検査実績", cn, adOpenStatic, adLockOptimistic

    Set rs2 = New ADODB.Recordset
    rs2.CursorLocation = adUseClient
    rs2.Open "不良実績", cn, adOpenStatic, adLockOptimistic

    Set rs3 = New ADODB.Recordset
    rs3.CursorLocation = adUseClient
    rs3.Open "検査員マスタ", cn, adOpenStatic

    Set rs4 = New ADODB.Recordset
    rs4.CursorLocation = adUseClient
    rs4.Open "端数記憶", cn, adOpenStatic

End Sub