質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • VBA

    2298questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Access

    590questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Access DAO→ADO接続に変更 ADO接続の正しいロジックを教えてください。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 16K+

nekomura

score 124

よろしくお願いいたします。

Accessで、テーブルデータやクエリを取得して使用するプログラムを作っています。
元のコードは、自身のテーブルデータやクエリからDAOを使用してデータを取得しています。
同様の内容を、
・Access自身のテーブル→SQLserverからのリンクテーブル(ODBC)
・DAO接続→ADO接続

と、書き換えたいのですが、ADO接続の方のコードの書き方が合っているか調べてもピンとこないのと、
エラーが出る為困っています。

元のコードは以下です。

Dim db  As DAO.Database
    Dim rs1 As DAO.Recordset
    Dim rs2 As DAO.Recordset
    Dim rs3 As DAO.Recordset

    Set db = CurrentDb()
    Set rs1 = db.OpenRecordset("顧客マスタ") //Accessテーブル
    Set rs2 = db.OpenRecordset("Q売上") //Accessクエリ
    Set rs3 = db.OpenRecordset("Q売上明細") //Accessクエリ


'-- いろんな処理

上記のコーディングで、問題なく目的のデータを取得できます。

同内容を、テーブルはSQLserverからのリンクテーブル(ODBC)を作り、ADO接続を用いて
同じようにデータを取得したいのですが、うまくいきません。

問題のADO接続のコードは以下です。
※追記(下記ADO接続コードにおける各テーブルとクエリの説明)
・顧客マスタ→SQLserverにあるテーブル。Accessにあるテーブルと同名のテーブル(顧客マスタ)。
リンクテーブルとしてAccessにおいてあります。
・Q売上→上記リンクテーブルを使用して作ったクエリ
・Q売上明細→通常のAccessのクエリ

Dim cn As New ADODB.Connection
    Dim rs1 As New ADODB.Recordset
    Dim rs2 As New ADODB.Recordset
    Dim rs3 As New ADODB.Recordset

    Dim strConnectionString As String  'SQLServer接続文字列

    strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2")) 
    //Access自身の"接続文字テーブル"に、SQLserverの接続文字列を格納し、取得しています。
 //このロジックで接続文字列は問題なく変数に代入されています。

    cn.Open strConnectionString

    rs1.Open "顧客マスタ", cn, adOpenForwardOnly, adLockReadOnly //リンクテーブル
    rs2.Open "Q売上", cn, adOpenForwardOnly, adLockReadOnly //リンクテーブルで作ったクエリ
    rs3.Open "Q売上明細", cn, adOpenForwardOnly, adLockReadOnly //Accessクエリ
    //上記の3行、レコードセット.Openのところがデバックでカーソルのあたる箇所

'-- いろんな処理


・エラー箇所は一番下の3行、レコードセット.Openのところで、
・[実行時エラー'2147217900(80040e14)':
ストアドプロシージャ’テーブル名(またはクエリ名)’が見つかりませんでした。]

と、エラーメッセージが出ました。
また、接続文字列に誤りはありません。

コーディングの仕方に問題があるのかと思い、ここで相談させていただきました。
有職者の皆様方、どうかご教示のほどをよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ttyp03

    2016/05/12 11:07

    以前の質問と同様かと思いますが、確認です。
    SQLServerには、Accessにあるテーブルと同名のテーブル(顧客マスタ、Q売上、Q売上明細)があり、それらのテーブルをAccessのVBAから参照したい、ということで正しいですか?

    キャンセル

  • nekomura

    2016/05/12 11:13

    ttyp03様
    ご指摘ありがとうございます。
    >SQLServerには、Accessにあるテーブルと同名のテーブル(顧客マスタ、Q売上、Q売上明細)があり、それらのテーブルをAccessのVBAから参照したい
    はい。実際にSQLserverにはそのテーブルがあり、リンクテーブルとしてAccessにおいてあります。
    しかし、顧客マスタ以外はクエリです。
    コードの中にコメントとして書いていただけなので、早速本文も編集します。
    ありがとうございました。

    キャンセル

回答 2

checkベストアンサー

+2

せっかくソースコードをかけているので、その意味を考えることで解決しましょう。

Set db = CurrentDb()
    Set rs1 = db.OpenRecordset("顧客マスタ") //Accessテーブル

この意味は理解できているんですよね。
これと、

cn.Open strConnectionString
   rs1.Open "顧客マスタ", cn, adOpenForwardOnly, adLockReadOnly //リンクテーブル

を対比して考えましょう。
「db」はなんですか。
「cn」はなんですか。
おまじないとしてではなく、言葉でそれを考えてみると、どうすればいいか、には辿り着くと思います。

まずそこからいってみましょう。


(2016/05/12 14:07 のコメントの続きです。)

1つのソースコードの中でSQLServerにもAccessにも接続したいのか、SQLServerへの接続はAccessのリンクテーブルを通じて行うのかで回答が変わりますが、仮に後者の場合、

ADOのコードに
Set cn = CurrentProject.Connection

が正解です。
元のソースコードの

Dim cn As New ADODB.Connection

Dim strConnectionString As String  'SQLServer接続文字列

strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2")) 

cn.Open strConnectionString

が、

Dim cn As ADODB.Connection

Set cn = CurrentProject.Connection

に置き換えれば動作するでしょう。


(2016/05/12 18:57 のコメントの続きです。)

>変数の「参照渡し」と「値渡し」を知っていますか
javaの資格を取る際に、勉強したので意味としてはわかります。

>↓の2つのコードの違いを理解できますか。
 Dim cn As New ADODB.Connection
 Dim cn As ADODB.Connection

実はこれは以前から気になっていたのですが、ネットなどでサンプルコードをみると、
 Dim cn As ADODB.Connection
 の方は、後ほど変数にNEWを代入してインスタンス化していますが、
 Dim cn As New ADODB.Connection
と初めから宣言しているとその後のインスタンス化は不要なのかなぁ…と、
ぼんやりとしかわからないので気になっていました。

あ、じゃあ説明はしやすいですね。

VBAの場合、大前提として Dim は変数の定義です。
その際、オブジェクト型の変数の場合、 New をつけることで同時にインスタンス化されます。

細かいことを抜きにして、

Dim obj as New object  ' 型宣言とインスタンス化を同時に行う


Dim obj as object     ' 型宣言
Set obj = New Object  ' インスタンス化

は同義です。

オブジェクト型以外のほとんどの変数の場合、VBAでは変数の代入は値渡しで行われるのですが、オブジェクト型の場合は参照渡しで行われます。

Dim obj1 As Object
Dim obj2 As Object

Set obj1 = New Object
Set obj2 = obj1

この場合、変数 obj2 は obj1 への参照となります。
つまり obj2 への操作は obj1 にも影響します。

Dim obj1 As Object
Dim obj2 As Object

Set obj1 = New Object
Set obj2 = New Object

Set obj2 = obj1


この場合、動作は結局一緒なのですが、obj2 として生成されたインスタンスは、obj1 への参照に上書きされ消えます。
(実動上は無駄なだけなはず)

で 2016/05/12 14:57 のコメントにあった下記のソースの

Dim cn As New ADODB.Connection 'SQLserverへの接続 
● Dim cn2 As New ADODB.Connection 'Accessへの接続
Dim rs1 As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim rs3 As New ADODB.Recordset

Dim strConnectionString As String 'SQLServer接続文字列

strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2"))
●Set cn2 = CurrentProject.Connection

cn.Open strConnectionString
●’cn2.Open ←ここでは実行時エラー'3705'「オブジェクトが開いている場合は、操作は許可されません」とエラーが出る為一旦コメントアウト中です。
        この記述は、不要もしくは違う箇所に書かなければなりませんか?ご教示いただければ幸いです。

rs1.Open "顧客マスタ", cn, adOpenForwardOnly, adLockReadOnly //エラー
● rs2.Open "Q売上", cn2, adOpenForwardOnly, adLockReadOnly
● rs3.Open "Q売上明細", cn2, adOpenForwardOnly, adLockReadOnly

cn2.Open でエラーが出る理由は、Dim cn2 As New ADODB.Connection としてインスタンスを生成したものの、その後で Set cn2 = CurrentProject.Connection をすることにより、cn2 はCurrentProject.Connection への参照となっています。

つまりいま開いているAccessファイルへの接続なので、さらにOpenはできないため、エラーが出ます。

Dim cn2 As ADODB.Connection
Set cn2 = CurrentProject.Connection


で、cn2 は既に開いたAccessDBへの接続になっているわけです。

という事でほぼ理解上は解決するのではないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/12 13:32

    Suenaga様
    いつもお世話になっております。
    毎回ためになるご回答に、感謝しております。

    db は、Access上の現在のデータベース、
    cn は、他のデータベースに繋ぎにいく為の設定…?といったところでしょうか。
    まだ経験値が浅い為、うまく言えませんがすみません。。

    DAOのほうのコードと比べて思ったのですが、
    ADOのコードに
    Set cn = CurrentProject.Connection
    というコードを追加する…などでしょうか。

    初心者の試行錯誤にお付き合いさせて申し訳ありませんが、今一度の
    お教えを頂けないでしょうか。
    どうぞよろしくお願いいたします。

    キャンセル

  • 2016/05/12 14:07

    ほぼ正解ですね。

    簡単に言えば、db も cn もつないでいるデータベース自体を示しています。
    そのデータベースに対して、SQLやテーブル名を指定することでレコードセットを取得する、ということを、DAOのソースコードの方では db 、ADOのソースコードでは cn を使ってやろうとしています。


    ADOの方、いまの cn は SQLServer への接続になっています。
    そのため、SQLServerにあるデータに対するSQLを発行し、レコードセットを取得することになります。

    この状態から、さらにAccessのDBからもレコードセットを取得したい場合、 cn とは別の ADODB.Connection オブジェクトを利用し、Accessへの接続を作る必要があります。

    続きは回答を編集します。

    キャンセル

  • 2016/05/12 14:56 編集

    Suenaga様
    お世話になっております。

    アドバイスに従い下記の様に追記いたしました。
    ●がついている箇所が、追記した部分です。
    Accessへの接続は、無事出来ました(ありがとうございます!)が、コーディングが正しいのか不安な為
    何か気になるところがございましたらご教示いただけると幸甚です。
    また、コード内に直接疑問をコメントしているcn2.Open部分についても教えを頂けばありがたいです。

    SQLserverへの接続は未だうまくいかず、エラー内容は本質問の時と変わらず同じメッセージがでます。
    接続文字列はあっているはずなのですが…。



    ```ここに言語を入力
    Dim cn As New ADODB.Connection 'SQLserverへの接続 
    ● Dim cn2 As New ADODB.Connection 'Accessへの接続
    Dim rs1 As New ADODB.Recordset
    Dim rs2 As New ADODB.Recordset
    Dim rs3 As New ADODB.Recordset

    Dim strConnectionString As String 'SQLServer接続文字列

    strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2"))
    ●Set cn2 = CurrentProject.Connection

    cn.Open strConnectionString
    ●’cn2.Open ←ここでは実行時エラー'3705'「オブジェクトが開いている場合は、操作は許可されません」とエラーが出る為一旦コメントアウト中です。
            この記述は、不要もしくは違う箇所に書かなければなりませんか?ご教示いただければ幸いです。

    rs1.Open "顧客マスタ", cn, adOpenForwardOnly, adLockReadOnly //エラー
    ● rs2.Open "Q売上", cn2, adOpenForwardOnly, adLockReadOnly
    ● rs3.Open "Q売上明細", cn2, adOpenForwardOnly, adLockReadOnly
    ```
    どうぞよろしくお願いいたします。

    キャンセル

  • 2016/05/12 15:45

    rs1で取得するデータはどうしてもSQLServerから取得したいんでしょうか。

    その場合、ちょっと今出てきている情報ではホントは足らないのですが、

    rs1.Open "顧客マスタ", cn, adOpenForwardOnly, adLockReadOnly



    rs1.Open "dbo.顧客マスタ", cn, adOpenForwardOnly, adLockReadOnly
    もしくは
    rs1.Open "SELECT * FROM dbo.顧客マスタ", cn, adOpenForwardOnly, adLockReadOnly

    とするといいかもしれません。

    ただ、AccessからSQLServerへリンクテーブルをはっているのであれば、Accessへの接続でデータは取得できるので、rs1.Open の cn もcn2 でできるはずです。
    その場合、cn は不要になります。


    ---
    で、見せていただいたソースコードに関してですが、その前に知識をいくつか確認です。

    - 変数の「参照渡し」と「値渡し」を知っていますか
    - ↓の2つのコードの違いを理解できますか。
     Dim cn As New ADODB.Connection
     Dim cn As ADODB.Connection

    それによって説明が必要な範囲が変わりそうですので、ひとまず質問です。

    キャンセル

  • 2016/05/12 17:06

    Suenaga様
    お世話になっております。
    14:07 のコメントの続きで、ひとまずうまくいきそうです!
    取り急ぎお礼まで。

    >rs1で取得するデータはどうしてもSQLServerから取得したいんでしょうか。

    現在、上長よりヒントのキーワードのみを受けてサンプルコードを書いています。
    次回から私が参加するシステム開発プロジェクトの前に、勉強しておくようにとの意図からです。詳細内容は聞かされていないのですが、その開発で使用するスキルに対し理解しておくべきキーワードが、
    ・ODBC接続
    ・リンクテーブル
    ・SQL認証接続文字列
    です。
    この3つとADO、DAOの関係がいまいち整理が出来ず、ここで質問をしていましたが、
    本日のSuenaga様とttyp03様のやり取りの中で、
    >AccessからSQLServerへリンクテーブルをはっているのであれば、Accessへの接続でデータは取得できるので、rs1.Open の cn もcn2 でできるはずです。
    など意味がわかってきました。
    なので、どうしても直接SQLServerから取得したいというわけでは今は無いのですが、
    上長からのキーワードのひとつに接続文字列があったため、本題のようなコードを書いていました。

    >変数の「参照渡し」と「値渡し」を知っていますか
    javaの資格を取る際に、勉強したので意味としてはわかります。

    >↓の2つのコードの違いを理解できますか。
     Dim cn As New ADODB.Connection
     Dim cn As ADODB.Connection

    実はこれは以前から気になっていたのですが、ネットなどでサンプルコードをみると、
     Dim cn As ADODB.Connection
     の方は、後ほど変数にNEWを代入してインスタンス化していますが、
     Dim cn As New ADODB.Connection
    と初めから宣言しているとその後のインスタンス化は不要なのかなぁ…と、
    ぼんやりとしかわからないので気になっていました。
    是非、よければSuenaga様からご教示いただきたく存じます。
    本日は何度もすみません。
    今日一日で、何日もわからなかったことがどんどん知ることが出来てきています。

    キャンセル

  • 2016/05/12 18:57

    事前学習という事であれば、AccessとSQLServerそれぞれに接続してそれぞれからデータを取得する、という事をやっておいたほうがいいかもしれませんね。

    また、リンクテーブルの利用は便利ではあるんですが大きな問題があり、例えば、

    - 顧客テーブル がSQLServerにある
    - そのテーブルに対してAccessでリンクテーブルを作る(仮にその名前を「リンク_顧客テーブル」)

    とした際に、

    SELECT * FROM リンク_顧客テーブル WHERE id = 1

    といったクエリを発行すると、

    - 1度SQLServerからAccessが顧客テーブルの全データを取得(つまり リンク_顧客テーブル に相当するデータを取得)
    - その上で WHERE句の解釈

    という動作をするため、顧客テーブルが大きくなればなるほど構造的に重く・遅くなることになります。
    そのあたりを踏まえて、

    - どこにデータがあるのか
    - この処理に必要なデータはどれか
    - 処理のプロセスで不必要にデータが大きくならないか

    といったことを検討した設計をすべきでしょう。

    参照渡しやnew のあたりの話はコメントだと重いので回答を編集します。

    キャンセル

  • 2016/05/12 19:19

    【おまけ】
    キーワード理解、といういみでは、ADOのConnectionオブジェクトのリファレンスを眺めることをおすすめします。
    https://msdn.microsoft.com/ja-jp/library/cc364251.aspx?f=255&MSPPError=-2147217396

    特にプロバイダの意味をわかると、ADOが汎用的、とか、ODBCとの関係、とか、接続文字列の意味、とか色々つながるかと思います。

    キャンセル

  • 2016/05/12 22:25 編集

    Suenaga様
    たくさんのご教示、本当にありがとうございます!!!
    今日は、とても勉強になりました。
    長い間、本日教えていただいたことの理解が出来ず、
    周りには質問することが出来ない状況だった為に本当に助かりました。
    ネットのやりとりでこんなにわかやすかったのは初めてで、感激です。

    たくさんのご回答、勉強しながら何度も読み返しております。
    本当にありがとうございます。

    >特にプロバイダの意味をわかると、ADOが汎用的、とか、ODBCとの関係、とか、接続文字列の意味、とか色々つながるかと思います。

    ばらばらだったこれらの、解決の糸口が見つかりとてもうれしいです!

    キャンセル

+1

すみません、上の所だと改行できないのでこちらで再確認させていただきます。
質問内容を読み取ると、構成としては、

<SQLServer>
顧客マスタ
<Access>
顧客マスタ(SQLServerへのリンクテーブル)
Q売上(Access
Q売上明細

こんな感じでしょうか。
だとすると、

    rs2.Open "Q売上", cn, adOpenForwardOnly, adLockReadOnly //リンクテーブルで作ったクエリ
    rs3.Open "Q売上明細", cn, adOpenForwardOnly, adLockReadOnly //Accessクエリ

この2つはできませんよね。
SQLServer上には存在しませんから。
顧客マスタに関してはSQLServerに「顧客マスタ」としてテーブルが存在し、接続文字列がきちんとSQLServerを指しているのなら問題ないように思えますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/12 12:05

    ttyp03様
    何度もありがとうございます。
    質問内容がわかりづらくご迷惑をおかけしてすみません。

    <SQLServer>
    顧客マスタ
    <Access>
    顧客マスタ(SQLServerへのリンクテーブル)
    Q売上(Access
    Q売上明細

    ↑はい、まさにその通りです。

    ご指摘を元に、二点ご教示をいただきたく存じます。
    まず、SQLServer上には存在しない下記2つ↓
    rs2.Open "Q売上", cn, adOpenForwardOnly, adLockReadOnly //リンクテーブルで作ったクエリ
    rs3.Open "Q売上明細", cn, adOpenForwardOnly, adLockReadOnly //Accessクエリ
    は、どのように取得すればよいのでしょうか…。
    元のコードのように、DAOで取得するのでしょうか。
    その場合は、一つのコードにDAOとADOが混在しますが、それは正しいやり方になりますか?

    もう一点ですが、
    >顧客マスタに関してはSQLServerに「顧客マスタ」としてテーブルが存在し、
    >接続文字列がきちんとSQLServerを指しているのなら問題ないように思えますが。
    ADOのコーディングは私が書いたものが、ttyp03様から見て正しいという認識でよろしいでしょうか。

    度々申し訳ありませんが、再度お教えを頂ければ幸甚です。

    キャンセル

  • 2016/05/12 13:04

    > SQLServer上には存在しない下記2つは、どのように取得すればよいのでしょうか…。

    ODBCでSQLServerを参照したいという目的なのに、Accessの情報を参照したいというのが何やら矛盾していませんかね。
    SQLServerには存在しないのですから、ないものはない、できないものはできない、としか言えません。
    それとも今Access上に構築しているリンクテーブルやクエリは全く使わず、SQLServerの情報だけを使うようにしたい、という要求でしょうか。
    そうであるなら、Accessのクエリに代わるものをSQLServer上に作成することになると思います。
    具体的にはVIEWを作る感じでしょうか。

    > ADOのコーディングは私が書いたものが、ttyp03様から見て正しいという認識でよろしいでしょうか。

    こちらは前回の質問と同じ回答になってしまいますが、接続文字列が正しいのであれば問題ないようには思えます。
    こちらに環境がなく検証ができないので断言できなく申し訳ないです。

    キャンセル

  • 2016/05/12 13:23 編集

    ttyp03様
    ご返信に感謝いたします。

    >ODBCでSQLServerを参照したいという目的なのに、Accessの情報を参照したいというのが何やら矛盾していませんかね。

    まだ経験が浅い為、とんちんかんな質問をしたようでもうしわけございません。
    DA0のほうのコードで出来たように、
    ・顧客マスタ(SQLServerへのリンクテーブルですが)
    ・Q売上(クエリ)
    ・Q売上明細(クエリ)
    の3つの内容が、これから作りたいロジックには必要なので、どれか一つだけ取得というわけにはいかなかったのです…すみません。

    >それとも今Access上に構築しているリンクテーブルやクエリは全く使わず、SQLServerの情報だけを使うようにしたい、という要求でしょうか

    いいえ、違います。
    ODBCでSQLServerを参照したテーブル、Accessの情報を参照したリンク双方のデータが必要です。
    これらをを同じプロシージャ内で取得するのは無理ということでしょうか?
    このような問題は、ネットで調べてもわからないため度々の質問ですが今一度ご教示頂けないでしょうか。

    >こちらに環境がなく検証ができないので断言できなく申し訳ないです。
    とんでもありません。
    とても助かっています。ありごとうざいます。

    キャンセル

  • 2016/05/12 13:33

    > ODBCでSQLServerを参照したテーブル、Accessの情報を参照したリンク双方のデータが必要です。

    ここでいう「SQLServerを参照したテーブル」は顧客マスタですよね。
    「Accessの情報を参照したリンク」は、顧客マスタのリンクテーブルですよね。
    ということは、どちらも同じところを参照しているわけですから、SQLServerへの接続とAccess内のDBへの接続を混在させる必要性はないです。
    リンクテーブルを参照すれば自ずとSQLServerのテーブルを参照していることになります。
    DAOの方のコードは実績があるわけですから、これが正しい姿だと思います。
    リンクテーブルを使わずに直接SQLServerを参照しないといけない理由があるのでしょうか?

    キャンセル

  • 2016/05/12 13:53

    少し勘違いしていました。
    DAOでの接続はできたので、ADOに変えたいということがそもそもの目的でしたね。
    とすると、現在のADOのコードだと、接続先がSQLServerに向いてしまっているので、それをAccessに向くようにすればよさそうです。
    これについてはkaz.Suenagaさんとのやり取りのほうで解決できそうですね。

    キャンセル

  • 2016/05/12 13:59 編集

    >ttyp03様
    何度もお答え頂きありがとうございます。
    以下、長文となりますがご了承願います。

    >リンクテーブルを使わずに直接SQLServerを参照しないといけない理由があるのでしょうか?

    言葉足らずで申し訳ありません。
    上司から次に作るシステムは、ODBCで作ったリンクテーブルと、クエリを使用したものを作ることになるので
    すぐにとりかかれるようにロジックを考えておくように言われており、現在作っているのは、私なりに考えたサンプルのコードです。
    サンプルの為、Accessのテーブル「顧客マスタ」と同内容のテーブルを作り、リンクテーブルで参照しています。
    Accessテーブル名と、SQLServerを参照したテーブル名(つまりリンクテーブルの顧客マスタ)が同じな為、わかりづらくてすみません。

    私自身の解釈として、
    ・DAOはAccessのjetDB?に接続
    ・ADOは外部のDBに接続
    という認識があったため、ADOを使用しなければいけないのかと思っておりこのようなコードを書いていました。
    ですが、Accessにあるクエリも同時に使いたい為、どのように記述すればよいのかわからなかったところ、ttyp03様のご指摘どおりクエリは
    rs3.Open "クエリ名", cn, adOpenForwardOnly, adLockReadOnly
    では取得できないということがわかり、どのようにすれば良いのかがわからなくなっておりました。

    >リンクテーブルを参照すれば自ずとSQLServerのテーブルを参照していることになります。
    >DAOの方のコードは実績があるわけですから、これが正しい姿だと思います。
    つまり、リンクテーブルでSQLServerを参照しているので接続文字列や、ADOは必要ないという事ですよね?

    ネットで調べるだけではその辺りが不明瞭で、お手わずらいをさせてすみません。

    キャンセル

  • 2016/05/12 14:12

    ttyp03様
    >DAOでの接続はできたので、ADOに変えたいということがそもそもの目的でしたね。
    すみません、こちらの3つ目のお返事時気づかず先ほどのコメントを投稿しました(ttyp03様の二つ目のご回答に対してです。)

    お二方のおかげで、少しずつ先が見えてきて楽しいです。
    ttyp03様とのやりとりは、とても有意義で自身で試行錯誤する力もつき、大変ためになります。
    ありがとうございます。

    キャンセル

  • 2016/05/12 14:32

    実の所、DAOとADOの違いを私自身良く知らなかったので改めて調べてみると、DAOの方が歴史は古く、ADOの方が新しい。但し、どちらでもAccessのDBへはアクセス可能であり、長所短所ともに一長一短といったところでしょうか。
    という感じのことが書いてあるサイトがありましたので紹介しておきます。
    http://tsware.jp/labo/labo_23.htm
    それぞれでのローカルDBへ接続するサンプルも載っていますので参考になるのではと思います。

    現状でDAOでの接続はできているのでそれでも良いと思いますが、せっかくなのでADOでの接続も実現させ、どちらが自分にとって使いやすいか検証してみるのがいいですね。

    キャンセル

  • 2016/05/12 14:38

    多少語弊もあるんですが、DAOとADO、役割として、ローカルファイルへのアクセスを前提としたDAOと、リモート接続を前提としたADO、といったイメージです。

    DAOの場合はJetDB(昔のAccessの mdb ファイル形式のもの)への接続専用、ADOの場合は接続文字列で汎用的に接続可能、という感じです。

    キャンセル

  • 2016/05/12 14:42

    kaz.Suenagaさん>
    解説ありがとうございます。為になります。
    ADOの方が汎用的に使えるとなると、将来的にもADOを使っておいた方が融通が利きそうですね。

    キャンセル

  • 2016/05/12 14:54

    ttyp03様
    Suenaga様
    なるほど…。
    とても為になります。
    ttyp03様、参考URLもありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • VBA

    2298questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Access

    590questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。