- ベストアンサー
Accessでの開発におけるADOとDAOの選択について
- Accessでの開発にはADOとDAOのどちらを使用するか迷うことがあります。データ件数や項目数が多い場合は、メインフォームでの修正/追加/削除は避け、サブフォームを使用することが一般的です。
- ADOとDAOの違いは、非連結フォームでの更新ができるかどうかです。ADOでは非連結フォームでの更新ができないため、連結フォームを使用する必要があります。一方、DAOは非連結フォームでも更新が可能ですが、ADOとDAOの共存はメンテナンス上の問題があります。
- 一般的には、データ件数や項目数が多い場合はADOを使用し、非連結フォームでの更新は連結フォームで対応することが推奨されています。また、将来的にSQLサーバーを使用しない場合は、Access単体(MDB)での開発が想定されています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Accessnoバージョンを記載しましょう。 >DAOは入りにくい しかし、Accessの規定はDAOですからねぇ。 どこがどう「入りにくい」のでしょう。例えば、 Set A = CurrentDb.OpenRecordset(~)で 返るレコードセットはDAOのレコードセットです。 その他、テーブル情報を調べる時もDAOのセットを 使う方がマッチしています。 わざわざADOのオブジェクトを作らなくても利用 できます。他のDBをリンクする場合はADOを考え ますけど、AccessのみならDAOだけで十分だと 思います。
その他の回答 (3)
- piroin654
- ベストアンサー率75% (692/917)
方向はきまったようようなので以下は付け足し 程度ですが。 >しかし、非連結のフォームに対してレコードセットの更新は >DAOではできるが >ADOではできない 理由が私には理解できないんですよね~ えーっと、少し分かり辛い文面なので勘違いならごめんです。 工夫と言えば工夫ですが、#1さんへの補足の最後のコードを ADOに切り替え、 strSQL = "SELECT * FROM TBL名" とし、 Me.NO = RS!NO Me.市町村 = RS!市町村 Me.薬局名 = RS!薬局名 Me.所在地 = RS!所在地 Me.電話番号 = RS!電話番号 をひっくり返し、 RS!NO = Me.NO RS!市町村 = Me.市町村 RS!薬局名 = Me.薬局名 RS!所在地 = Me.所在地 RS!電話番号 = Me.電話番号 にすれば、非連結フォームに書き込まれた データを元にテーブルの更新ができます。 以下は直書きなので何かが抜けているかも しれませんが、 Dim cn As New ADODB.Connection Dim RS As New ADODB.Recordset Dim cmd As New ADODB.Command Set cn = CurrentProject.Connection cmd.CommandText = "SELECT * FROM TBL名" Set cmd.ActiveConnection = cn RS.Open cmd, , adOpenKeyset, adLockPessimistic With RS .AddNew .Fields("NO") = Me.NO .Fields("市町村")= Me.市町村 .Fields("薬局名") = Me.市町村 .Fields("所在地") = Me.市町村 .Fields("電話番号") = Me.市町村 .Update End With このような感じで非連結フォームの コントロールの値を参照してテーブルの 更新をします。 あるいは、strSQLを更新クエリにして、 cn.Execute strSQL という方法もあります。こちらは速い。
- nda23
- ベストアンサー率54% (777/1415)
#1です。 >Me.RecordSource = TBL名 → set Me.RecordSource = TBL名 >(左だとエラー(本推奨)、右だと成功。わけわからん) レコードソースはテキスト型ですので、左が正しいし、 エラーになることはありません。他のプロパティと 間違えていませんか? また、レコードソースを変更した後、Me.Requeryを 実行しているでしょうか? >終了処理が無い レコードセットで更新するならフォームを使う理由は? それと、フォームは静的に作ることが多いので、動的に コントロールソースを設定するというのが不自然です。 設計企図が見えません。 >Set Me.Recordset = RS 普通、このプロパティは変更しません。レコードソースを 変更し、Requeryすれば変更されるからです。参照する ことは無いことはないものの、極めて稀です。 連結フォームで処理するのか、フォームは非連結で、 内部でレコードセットや更新クエリで処理するのか バラバラのように思えます。統一すべきでしょう。
補足
#1さん 早いレスポンスありがとうございます 助かります(_ _)m ずばり言いますと、わけがわからなくなっちゃってるんですね。(汗'') 整理しますと、 1 ADOかDAO どちらか1つにしてコーディングする 2 追加/更新/削除/は1つのサブフォームで行う 3 書き方は全て統一する。SQLを使用して2をやるならSQLで全てやる SQLを使用しないでやるならSQL不使用でやる 4 テーブルを開く→メソッド→テーブルを閉じると一連の流れになっているか さきほど、ADOのレコードセットをフォームにもってきたとき読み取り専用になる 現象を他の方法でできないか試してみました。 こちらは一度変数に格納してからフォームのテキストボックスに変数を設定して 更新ボタンを押すと wCNN.Execute strSQL で更新できるロジックに変更しました。 これが解決できたことにより 1、2、3、4全ての条件を満たすことが可能となりました。 DAOだと私のもっているテキスト本ではSQLでやる場合 4がぬけてるんですね。 ADOだとSQLを使用しても4のステートメントがテキスト本でもネットでもあるので ADOにしました。 これで、フォームは非連結で、 内部でレコードセットや更新クエリで処理し統一しました。 ちなみに Set Me.Recordset = RS これはレコード群をフォームのレコードソースに設定していることで 連結フォームのレコードソースプロパティにTBL名やクエリ名を設定していることと 一緒の意味なんですよね? 徐々に理解しながら、ADOのコーディングの形を構築していきたいと思います レスポンスありがとうございました(^^)/
- piroin654
- ベストアンサー率75% (692/917)
(1),(2),(3)のどれで開発するかと言われれば、 時と場合による、です。 (1)は横槍が入った場合と必要に迫られた場合。 (2)は縛りが無ければADOを使うメリットは無いから。 (3)は横槍が入った場合と必要に迫られた場合。 ADOは他の言語からmdbファイルにアクセスする場合は 使いますが、Access単独の場合は上記の感じです。 したがって、ユーティリティなども含めてほとんどDAOです。 (1),(2),(3)のどれで開発しますか、という問いも 変な感じですが、DAOがはいりにくいならばADOでも いいでしょう。Accessは2000からはADOもサポート しています、が、新しいバージョンになってもAccessの ネイティブランゲージはDAOです、と言い切ってしまい ましたが他意はありません。 >メインフォーム データ検索 帳票フォームに全データを出力 >・・・・・・・ ならば、私はだまってDAOです。 まあ、好きなほうで開発されればいいかと思います。
お礼
回答ありがとうございます。 ADOのコーディングをDAOで現在書き換えています しかし、非連結のフォームに対してレコードセットの更新は DAOではできるが ADOではできない 理由が私には理解できないんですよね~ 本もADOが大半だし、、、 レスありがとうございます(^^)/
補足
早速のレスポンスありがとうございます Accessのバージョンは2003です 入りにくいのは、ADOの場合 ネットまたは本において、定義なども含めてコーディングの仕方が同じ であることが入りやすい理由にあげられます。 調べる場合などはいいんですよね。 対してDAOの場合は、ネットまたは本でバラバラであることが入りにくい 理由です。 パターン1 Dim DB as database dim RS as recordset set DB = currentDB set RS = db.openRecordset(TBL名,dbopenDynaset) Me.RecordSource = TBL名 → set Me.RecordSource = TBL名 (左だとエラー(本推奨)、右だと成功。わけわからん) RS.close DB.close パターン2 終了処理がない strSQL = "Select *~省略" me.recordsource = SQLstatement 名前.controlsource = "名前" パターン3 Set DB = CurrentDb strSQL = "SELECT * FROM TBL名 where [NO] =" & 1 Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset) Set Me.Recordset = RS Me.NO = RS!NO Me.市町村 = RS!市町村 Me.薬局名 = RS!薬局名 Me.所在地 = RS!所在地 Me.電話番号 = RS!電話番号 微妙にちがうんですよね~