Accessデータベースでのクエリ実行に関するエラー

このQ&Aのポイント
  • Accessデータベースで作成したクエリをVBコードから実行した際に、追加クエリが反映されない問題が発生しています。
  • Accessからの追加クエリ実行やパススルークエリでも同様の問題が発生しており、設定に誤りがある可能性があります。
  • 正常に反映されることが期待されるのにも関わらず、何らかの原因でクエリが実行されていない可能性があります。
回答を見る
  • ベストアンサー

デザインビューで作成したクエリの実行

よろしくお願いします。 環境  WindowsXP  Access2003  VB2005 以下の内容でAccessの準備をしました。  1.AccessでテーブルA,Bを作成。  2.テーブルAから条件に合ったデータを抽出する選択クエリC作成  3.選択クエリCとテーブルBの差分クエリDを作成  4.差分クエリDをテーブルBに追加する追加クエリEを作成 その後VBで以下のコードを実行すると途中でエラーにもならず終了するのですが Accessを開いてみても追加クエリEが反映されていません。 Sub test()   Dim Cnn As New ADODB.Connection   Dim Cmd As New ADODB.Command   Cnn.Provider = "Microsoft.Jet.OLEDB.4.0"   Cnn.Open("\\ファイルサーバー名\DB.mdb")   Cmd.ActiveConnection = Cnn   Cmd.CommandText = "追加クエリE" ← 反映されていない   Cmd.Execute()   Cmd = Nothing   Cnn.Close() : Cnn = Nothing End Sub Accessから追加クエリEを実行すると正常に反映されているのでAccessの 設定は合っていると思います。 また追加クエリEをAccessからパススルーを開いてSQLを直接”追加クエリEにコピペしても うまく動いてくれません。(反映されない) 何が間違っているのかご指摘ください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

まず、VB.NET で ADODB は使わないようにしてください。 ADODB は VB6 以前の技術で、15年以上前の技術です。 VB.NET からは専用の ADO.NET が用意されました。 (初版はこれも10年前なので、今更 ADODB 使ってる 技術者って過去の遺産を引き継ぐ必要がある人か、 新しい技術が覚えられない人か。。。) プログラムの実行環境がベースから大きく見直され ました。ADO.NET を使う事を強くお勧めします。 > Cmd = Nothing > Cnn = Nothing この辺りのコマンドの意味がほぼ無くなりました。必要 なくなったのではなく、Nothing を設定しても Access 側の 参照カウンタが減らないので、後始末できなくなってしまい ました。 本当に後始末しようと思っているなら、ReleaseComObject で COM オブジェクトを解放する必要があります。 Excel では頻繁に問題が表面化するのですが、Access の場合 あまり表に出て来ないようです。ただし、連続使用してる うちにメモリリークの問題がいつ発生しても不思議では ありません。 本題では、問題を切り分けられるようなテストプログラムを 考えて、結果を確認して下さい。 追加クエリって Insert 文のことですか? なら、単純な1行追加クエリを実行すれば、追加クエリE に問題があるかどうかの参考になるのでは? 聞いてる限り、Access でのみ参照可能な何かを使っているとか。 2.3.4.の手順が別なのも気になります。 4.がトリガーで、2.3.の処理が行なわれなければ、 4.の実行時に2.3.の処理結果が残っていないという ことはありませんか?つまり、差分0行で問題なく処理と。 > デザインビュー が Access 側の話なら、そういうことじゃないんでしょうか。 まぁ、質問文の説明では、やりたいことは大体分かるけど、 実際にパソコンのメモリ上でどんなデータがどう処理されて いるかを確認できる情報が無いので、なんとも言えませんが。

yskz_325
質問者

お礼

MARU4821さん 回答ありがとうございました。 ADODBは15年も前のものだったんですね。 何の知識もないまま更に昔のDAOのコードを参考に作ろうとしていたために こんな事になってしまいました。 MARU4821さんにADO.NETでと言う事で道筋を提示してもらいましたので 今回の質問は中途半端になりますが一旦置いておいてまずはADO.NETの 勉強をしてみたいと思います。 あと今日試していて原因らいしものがありましたので書き留めておきます。 MARU4821さんにご指摘いただいた「4がトリガーで2,3の処理が行われ なかった」がまさにその通りのようで差分クエリDのレコードカウントを コード中で取得してみたら0件でした。 デザインビューで作成したクエリはそのままVB.NETでは使えないんですかね? 何か使い方があるとは思いますのでこれも勉強してみます。 今度はADO.NETの質問でお世話になると思いますので その時はよろしくお願いします。  

その他の回答 (1)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

あ、あと、 > Cnn.Open("\\ファイルサーバー名\DB.mdb") http://www.mig.co.jp/access/contents/access_kyoyu.htm http://www.naboki.net/access/achell/ Access は単一パソコンで動かすアプリケーションという 位置付けで、本格的なデータベースに必要な機能が色々 足りません。結果、ファイルサーバーで複数名で使う やり方では頻繁にファイルが壊れたりする場合があります。 上手くいけばいいですが、だめな時はとことんだめなので よく勉強しておく必要があります。

yskz_325
質問者

お礼

MARU4812さんへ 回答ありがとうございました。 一回目の回答に付けたお礼の文中のお名前がMARU4821さんとなって おりました。 MARU4812さんですね。 失礼しました。 ACCESSが共有して利用するのに適さないものだと言うことは薄らと 知ってはいるのですがコストメリットと他のDBを運用するだけの 知識がないのでしかたなく利用している次第です。 (ACCESSの知識もありませんが・・・) 利用が少人数でしかも利用頻度もそう高くないので今のところ大きな 問題は出ていないですかね。 それと破損した場合の復旧が比較的簡単にできると言う事もあります。 そんな感じでズルズル使っております。

関連するQ&A

  • Accessのクエリ実行について

    すみません。ご存知でしたら、教えてください。 まず一点、基本(?)を確認させてください。 下記のように数個のテーブルとそれらを使用した数個のクエリがあったとします。 下記の場合に、もしどれかのテーブルを更新したとします。 その場合、アクセスを立ち上げて、クエリ3を実行するだけで、結果には反映されているのでしょうか?それとも、アクセスを立ち上げて、 クエリ1を実行し閉じ、クエリ2を実行し閉じ、最後にクエリ3を実行しないと、反映されていないのでしょうか? --------------------------------------------------------- テーブルリンクA 、テーブルリンクB、テーブルリンクC、テーブルリンクD ↓↓ テーブルAとテーブルBでクエリ1(マッチング)を作成 テーブルCとテーブルDでクエリ2(マッチング)を作成 ↓↓ クエリ1とクエリ2でクエリ3(マッチング)を作成 ------------------------------------------------- 続いて、もし上記でいちいち途中のクエリを実行しないと、 最後のクエリに反映されない場合、すべてをACCESSを立ち上げたと同時に自動実行し、自動で最後のクエリ(この場合、クエリ3)をエクスポートしたいと考えています。可能でしょうか? 素人な質問ですみません。 何卒よろしくお願いいたします。

  • 抽出条件のあるクエリにADOで新規にレコードを追加

    抽出条件のあるクエリにADOで新規にレコードを追加する事は不可能でしょうか? フォーム1にテキスト0を配置し SELECT テーブル1.色 FROM テーブル1 WHERE (((テーブル1.色)=[Forms]![フォーム1]![テキスト0])); というクエリを作成しました。 テーブル1のデータは 色 黄 黒 青 赤 です。 ADOでクエリにデータを追加したいのですが Public Sub Exsample() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM クエリ1" ここの時点で 「実行時エラー:'-2147217904 (80040e10)': 1つ以上の必要なパラメータの値が設定されていません。」 と表示されてしまいます。 「クエリ1」を「テーブル1」にしたらうまくいきます。 だったらテーブルに追加したら?と思われると思いますが 今回は例であり、実際はクエリに追加したいです。 回避方法があれば教えてください。 よろしくお願い致します。 (ヴァージョンはアクセス2003です)

  • 選択クエリを基に不一致クエリを作成したけれど...

    識者の力をお借りしたく質問いたします。 質問ページから不一致クエリに関する内容を参考に、ある不一致クエリを作成しています。 しかし、出来るはずの方法で結果が正しく表示されず途方にくれています。 処理の内容としては、あるクエリのフィールドを参考に不一致クエリで差分レコードを抽出したいというものです。 通常不一致クエリはテーブルの主キーを基に作成するものと私は理解しているのですが、今回の処理では基のテーブルに主キーが無く、(作成できない事情があり)クエリで無理矢理主キーもどきのものを作りました。 クエリで作成したのは、数字6桁(最大で)の後ろにチェックディジットとしてアルファベット1文字を追加した計7文字のフィールドです。 例:131401A 不一致を抽出したい基となる2つのテーブルに対しこのクエリを作成しました。 この2つのクエリから不一致クエリで差分を抽出し、基のテーブルに追加クエリで追加したいのですが、どうやっても不一致項目が表示されません。 根本的にクエリからの不一致クエリは作成できないのでしょうか? よろしくお願いいたします。 ■状況 テーブル1/テーブル2(基となるテーブル、主キー無し) クエリ1/クエリ2(テーブル1/テーブル2のレコードにコードを追加するクエリ) コード1/コード2(クエリ1/クエリ2で作成したコード)例:131401A 不一致クエリ テーブル2 → テーブル1 (リレーションシップ) コード2 条件:Not Null ※テーブル2の方が最新レコードが入っているので、テーブル2の差分レコードをテーブル1に追加したいというのが基本的な内容です。 よろしくお願いいたします。

  • レコードの削除

    VB6.0 ACCESSで開発しています。 t_nyukoテーブルのデータを全て削除するのは下記のように 出来たのですが dataGridに表示されているものを1つ選択し 選択されたものだけ削除したいのですがどうすればいいのでしょうか? よろしくお願いします。 Private Sub Command1_Click() Dim cn As New ADODB.Connection Dim cmd As ADODB.Command Dim cat As New ADODB.Command Dim strSQL As String   Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\temp\db2.mdb" cn.Open cat.ActiveConnection = cn strSQL = "DELETE FROM t_nyuko " Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = strSQL cmd.Execute cn.Close Set cmd = Nothing Set cn = Nothing Set cat = Nothing End Sub

  • ACCESS2007のクエリ・デザインシードビューとデータシービューで違うフィールド順番になる

    はじめまして<(_ _)> ACCESS2007で作業をしています。 検索・抽出条件によっていくつかのクエリで作業しています。 いづれも元のテーブルデータは同じです。 クエリにフィールドを追加挿入した場合、 クエリAでは追加挿入した順序通り、データシートビューで表示されるのですが、 クエリBはデータシートビューで見た場合、デザインビューで追加挿入した場所とは違い、 一番最後に挿入されてしまいます。 クエリAもBも元となるクエリXから 「名前をつけてオブジェクトを保存」で作成しました。 自分で設定した覚えはないのですが、 違いがでるのはどこかを触ってしまったんだと思います(>_<) クエリのプロパティを見てみましたが、 クエリAもBもXも全く同じ設定です。 お分かりの方がいましたら、ご教授願います<(_ _)>

  • 【MS ACCESS】 クエリの結果を文字列で書き出す事に悩んでいます。

    お世話になります。 選択クエリの結果を文字列として書き出したいので、いろいろ調べてみると 以下のコードを見つけました。 ======================== Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim strData As String Set cnn = CurrentProject.Connection With rst .Open "顧客マスタ", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect strData = .GetString(adClipString, 10) Debug.Print strData .Close End With cnn.Close ================================== これはテーブルを文字列としてイミディエイトウィンドに書き出すものなのですが、これがテーブルだけしか使えず、難儀しております。変更しようにもなにぶん実力がないもので手が出ません。 どうぞ、選択クエリの結果を文字列として表示させる方法を教えてください。 お願いします。

  • ACCESSのテーブル作成クエリについて

    お世話になっております。 以下の点について教えてください。 1.テーブル作成クエリで作ったテーブルの書式固定  クエリ実行後、テーブルは作成されるのですが、クエリで設定した書式が  反映されません(例:数値→標準→小数点以下3)。  クエリで設定した書式をテーブルに反映させる方法を教えてください。  現在は、テーブル作成クエリ実行後、いちいち、テーブルの書式を変更しております。 2.ユーザー設定モードでのオブジェクト移動  ・ACCESSをユーザー設定 & グループでフィルターの状態で使っています。  ・この状態でテーブル作成クエリとテーブル作成クエリ実行後に作成されるテーブルを   グループ分けして分類しておりますが、各グループにあるテーブル作成クエリを   実行すると、グループ内にあったテーブルが「割り当てられていないオブジェクト」に   移動してしまいます。  テーブルをグループ内に固定する方法を教えてください。 よろしくお願いします。 

  • ADOでパラメタクエリを実行する方法で混乱してます。

    VBからACCESSのクエリを実行したいのですが、 うまくいきません。 1:cmd.Properties("Jet OLEDB:Stored Query") = True←?? 2:cmd.CommandText = "qryKokyaku_UPD"←クエリをセット 3:cmd.Parameters(0).Value = txt.Text←パラメタセット 4:cmd.Execute (cmdはADODB.COMMANDオブジェクトです) 上記のコードでクエリを実行できますが、1行目の 意味が全然分かりません。1行目を除くと、パラメタをセットする(2行目)でエラーがでます。(SQLステートメントが正しくありません)なぜか分かるかた居られましたら、アドバイスお願いします! 分からないまま使用するのはいやなので現在は 1:cmd.CommandText = "qryKokyaku_UPD"←クエリをセット 2:cmd.Execute ,Array(パラメタ1,パラメタ2) という感じで作っています。 しかし、この方法では更新クエリを実行しても、更新したり、しなかったり、(ほとんど更新してくれない)です。 ですが、Executeはエラーなく通ります。 ADD、デリート等のクエリは問題ないのですが。 現在の状況はこんな感じです。 『cmd.Properties("Jet OLEDB:Stored Query") = True』 が何を意味しているのか理解できれば、無事解決です! アドバイスよろしくお願いします。 かなり低レベルな質問かもしれませんが。

  • テーブル作成クエリーでオートナンバー型のレコードを作成したい。

    教えてください。Access2000で困ってます。 テーブル作成クエリーから作成するテーブルAにオートナンバー型のレコードを追加したいのですが、どうしたらいいでしょうか? テーブルAに先にオートナンバー型のレコードを追加しておいても再度クエリーを実行するとなくなってしまいました。 できればクエリーでなんとかしたいのですが無理なんでしょうか? ご存じの方、お願いします! もう、頭がパンクしました!

  • クエリの作成方法

    支店に月次の実績報告を毎月出すのですが、現在は全支店のテーブルAと実績内容のデータがあるテーブルBがあります。この2つのテーブルを使って、 (1)テーブルAとテーブルBを使ったクエリ1を作成しレポートIを作成 (2)テーブルAとテーブルBの差分クエリでレポートIIを作成 (3)(1)と(2)で作成したレポートを支店コード順に手作業で並び変えています。 ※上記レポートIとIIの様式は同様で、レポートIIには「今月の実績はなし」との文言が入っているだけです。 これをどうにかして、レポートをひとつだけにして最初から支店コード順に印刷できないものかと、試行錯誤を繰り返していますが、初心者の私ではいいアイディアが浮かびません。 皆さんのお知恵を拝借させてください。よろしくお願いします。

専門家に質問してみよう