よろしくお願いいたします。
Accessのフォーム上のボタンイベントで、SQLserverよりテーブルデータを取得するイベントプロシージャを書いています。
取得しようとしているテーブルデータ「Q_m_kokyaku_shohin」は、実際にはクエリです。
ODBCでSQLserverより接続したリンクテーブルを、二つ使用して作っています。
しかし、実行時エラーが起きてしまい、下記コードの
Rs.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly
に黄色のカーソルがフォーカスされます。
エラー内容は、
「実行時エラー'2147217865(80040e37);
オブジェクト名'Q_m_kokyaku_shohin'が無効です。」
でした。
デバック→ステップインでコードを追っていった所、接続文字列は問題無く変数に代入されています。
その上で、原因及び修正方法を調べても解決にいたりません。
有職者の皆様にお知恵をいただきたく存じます。
Private Sub クエリ取得_Click()
Dim Cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim strSQL As String
Dim strConnectionString As String 'SQLServer接続文字列
strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2"))
//Access自身のテーブルに、接続文字列を入れて、その値を変数に代入しています
strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
strSQL = strSQL & " WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'"
Cn.ConnectionString = strConnectionString
Cn.Open
Rs.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly //エラーのデバッグポイントはここ
Set Me.Recordset = Rs
Rs.Close
Cn.Close
Set Rs = Nothing
Set Cn = Nothing
End Sub
また、このクエリをの全データの中から、任意の一文字の前方一致検索に対応するデータを
取得したいです。
初めの一文字はユーザーが入力する任意の値を想定している為、「*」を使用しています。
*から始まる任意の値です。
この記述の仕方は合っているのでしょうか…。
ネットで調べると、「初めがAの前方一致検索」など、特定のを使う方法しか出てこないもので…。
細かい部分の記述の仕方がわからず困っています。
併せてお答え頂ければ幸甚です。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
WHERE句をコメントアウトしても同様のエラーという事は、クエリ[Q_m_kokyaku_shohin]を開く時点でエラーが発生していると考えられます。
まずはクエリ[Q_m_kokyaku_shohin]が適切に開けるようにしてみましょう。
随分前の記憶なので曖昧な書き方になります。
ADOを利用している場合、Accessのクエリで利用しているワイルドカード「*」「?」と、一般のSQL(ANSI規格)でのワイルドカード「%」「_」が異なっているため、適切にクエリが実行できないことがあります。
クエリ側にワイルドカードが含まれている場合はそれをなくせないか、VBA内でWHERE句を作ることで回避できないかをご検討ください。
ひとまず概要までですが。
書いてから気づきましたが、違いますね。
[Q_m_kokyaku_shohin]はAccessのクエリですよね。
コネクションCnはSQLServerに対するものですよね。
そうだとして。
SELECT * FROM Q_m_kokyaku_shohin
では、[Q_m_kokyaku_shohin]はSQLServer側になければいけません。
まず、SQLServerで正常に実行できるSQL文を作ってみましょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
クエリ名Q_m_kokyaku_shohin
が間違っているということはないでしょうか?
また、問題を切り分けるために
strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
strSQL = strSQL & " WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'"
上記を下記のようにしてもエラーは出ますか?
strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
環境がなく確認できませんが、Cn.Open
でエラーにはなっていませんか?
(エラーが検知できるのかはわかりませんが・・・)
またIDとパスワードの指定がなさそうですが、接続文字列に含まれているということでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
一度、エラートラップを入れてみて、エラー箇所を特定してみてはどうでしょうか?
Private Sub クエリ取得_Click()
On Error GoTo myError '★追加
Dim Cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim strSQL As String
Dim strConnectionString As String 'SQLServer接続文字列
strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2"))
//Access自身のテーブルに、接続文字列を入れて、その値を変数に代入しています
strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
strSQL = strSQL & " WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'"
Cn.ConnectionString = strConnectionString
Cn.Open
Rs.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly //エラーのデバッグポイントはここ
Set Me.Recordset = Rs
Rs.Close
Cn.Close
Set Rs = Nothing
Set Cn = Nothing
Exit Sub '★追加
myError: '★追加
MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & Err.Description, vbExclamation '★追加
End Sub
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
kaz.Suenaga
2016/05/10 13:01
WHERE Q_m_kokyaku_shohin.顧客番号 like '*%' の部分の意図は、*ので始まるもの、%で終わるもの、どちらのつもりですか。
nekomura
2016/05/10 13:07
suenaga様
いつもお世話になっております。
「*ので始まるもの」という意図です。
よろしくお願いいたします。
kaz.Suenaga
2016/05/10 13:15
もう1点、「顧客番号」というフィールドの型は文字列で間違いないですか。
nekomura
2016/05/10 13:23
suenaga様
ご指摘ありがとうございます。
「顧客番号」は、SQLserver上でint方、Accessのクエリでは数値型でした…orz
ちなみに、
---strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
strSQL = strSQL & " WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'"
---
の、二行目をコメントアウトしても当該エラーは出ますが、この場合も文字列でないことに何か関係はありますか。
お教えいただけると幸いです。
いつもありがとうございます。
kaz.Suenaga
2016/05/10 13:28
この後回答も書いてしまいますが、Q_m_kokyaku_shohin で書かれている中身にワイルドカード( * )が含まれている条件式がありませんか。
nekomura
2016/05/10 13:37
Suenaga様
お世話になっております。
Q_m_kokyaku_shohin のクエリをデザインビューで見た時の、下部にある表の部分に何か条件式があるかという意味でしょうか。
もしそうであれば、特に条件式は指定しておりません。
どうぞよろしくお願いいたします。
kaz.Suenaga
2016/05/10 13:42
クエリの構成がわからないので見当違いかもしれませんが、そのクエリで利用しているデータは更に別のクエリを利用していたりしませんか(つまりクエリを使ったクエリになっていませんか)。
そのクエリ[Q_m_kokyaku_shohin]からデータテーブルにたどり着くまでに経由する全てのクエリでワイルドカードが使われていないかが気になります。
nekomura
2016/05/10 13:53
suemaga様
当該クエリは、リンクテーブルを二つ合わせたもので、クエリを使ったクエリではありません。
初心者の為、
>データテーブルにたどり着くまでに経由する全てのクエリでワイルドカードが使われていないかが気になります。
の辺りがいまいち理解できないのですが、クエリを作った際に何か条件式をつけていないか?ということですよね。
ご回答併せて、少し落ち着いて調べてきます。
まだ自分では方向性を広げて考えることが出来ていないので、たくさんのご指摘・アドバイスは本当に助かります。ありがとうございます。