No.4
- 回答日時:
・パラメータの指定は最大3つまで。
・パラメータの記述は次で統一。
一番目=[xxxxx]
二番目=[yyyyy]
三番目=[zzzzz]
こういう約束ですと、自分だけが使う次のような関数を用意すれば・・・。
Public Function SetQueryParameters(ByVal strQueryName As String, _
Optional varParamValue1 As Variant = Null, _
Optional varParamValue2 As Variant = Null, _
Optional varParamValue3 As Variant = Null) As String
On Error Resume Next
Dim cnn As ADODB.Connection
Dim cat As ADOX.catalog
Dim cmd As ADODB.Command
Dim strCommandText As String
' 接続を開きます。
Set cnn = CurrentProject.Connection
' カタログを開きます。
Set cat = New ADOX.catalog
cat.ActiveConnection = cnn
' Command オブジェクト
Set cmd = New ADODB.Command
Set cmd = cat.Procedures(strQueryName).Command
' パラメータの置換
strCommandText = cmd.CommandText
strCommandText = IIf(Len(varParamValue1 & "") > 0, Replace(strCommandText, "[xxxxx]", varParamValue1), strCommandText)
strCommandText = IIf(Len(varParamValue1 & "") > 0, Replace(strCommandText, "[yyyyy]", varParamValue2), strCommandText)
strCommandText = IIf(Len(varParamValue1 & "") > 0, Replace(strCommandText, "[zzzzz]", varParamValue2), strCommandText)
SetQueryParameters = strCommandText
End Function
添付図では、次のDBSelect()が、ちゃんと"A"を取得しています。
Public Function DBSelect(ByVal strQuerySQL As String, Optional strPause As String = ";") As Variant
On Error GoTo Err_DBSelect
Dim I As Integer
Dim J As Integer
Dim R As Integer ' DataValue(,) のインデックスを決める行カウンター
Dim C As Integer ' DataValue(,) のインデックスを決める列カウンター
Dim M As Integer ' DataValue(,) の一つ目の添字の最大値=行総数 - 1
Dim N As Integer ' DataValue(,) の二つ目の添字の最大値=列総数 - 1
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
Dim strList As String ' 全てのデータをセミコロン(;)等で区切った文字列に
Set rst = New ADODB.Recordset
' =================
' Begin With: rst
' -----------------
With rst
.Open strQuerySQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
If Not .BOF Then
' --------------
' 配列を再宣言
' --------------
M = .RecordCount - 1
N = .Fields.Count - 1
ReDim dataValues(M, N)
' ------------------------------------
' 列情報を For-Next で配列に代入する
' ------------------------------------
.MoveFirst
For R = 0 To M
C = -1
For Each fld In .Fields
With fld
C = C + 1
dataValues(R, C) = .Value
End With
Next fld
.MoveNext
Next R
Else
ReDim dataValues(0, 0)
dataValues(0, 0) = ""
strList = ""
End If
End With
' ---------------
' End With: rst
' ===============
' -------------------------------
' 区切子(;)で連結して1文に
' -------------------------------
If Len(strPause) Then
For I = 0 To M
For J = 0 To N
strList = strList & dataValues(I, J) & strPause
Next J
strList = strList & Chr(13)
Next I
End If
Exit_DBSelect:
On Error Resume Next
rst.Close
Set rst = Nothing
DBSelect = IIf(Len(strPause), strList, dataValues())
Exit Function
Err_DBSelect:
MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & Err.Description & Chr$(13) & _
"・SQL Text=" & strQuerySQL, _
vbExclamation, " 関数エラーメッセージ"
Resume Exit_DBSelect
End Function
No.3
- 回答日時:
? DBSelect(Replace(GetQueryText("testQ"), "Forms!B!ID", Forms("B").Controls("ID")))
B;1;
添付図が見にくいので・・・。
つまり、クエリのSQL文を取得し、Replace関数でパラメータをセットしてADOに渡せば、<ちょっと面倒なやり方>をする必要はないということです。
この回答へのお礼
お礼日時:2014/12/04 18:14
ご教示ありがとうございます。
なぜADOでパラメータークエリーがうまく動かないのか、原因と解消法がわかりました。
ただ、一度に複数のパラメーターを取得する場合は、どの様にしたら良いのでしょうか。
とりあえず、フォーム側を細工すればひとつのパラメーターで済ませそうですが。
No.2
- 回答日時:
>ADOでフォームを参照するパラメータークエリーを開こうとすると、
>エラーが発生してしまいます。
>もちろん、クエリー単体では正常に動作しますが、
>クエリーのパラメーターを工夫してもADOでは開けません。
これは、当たり前のことですよ。
例えば、次のような関数を用意してテストすると判ります。
Public Function GetQueryText(ByVal strQueryName As String) As String
Dim cnn As ADODB.Connection
Dim cat As ADOX.catalog
Dim cmd As ADODB.Command
' 接続を開きます。
Set cnn = CurrentProject.Connection
' カタログを開きます。
Set cat = New ADOX.catalog
cat.ActiveConnection = cnn
' Command オブジェクト
Set cmd = New ADODB.Command
Set cmd = cat.Procedures(strQueryName).Command
GetQueryText = cmd.CommandText
End Function
【testQ】
SELECT B.Field_1, B.ID
FROM B
WHERE (((B.ID)=[Forms]![B]![ID]));
Accessでクエリを実行するとtestQ のWhere節は
WHERE ID=2
に変換されてます。しかし、ADOで実行しても、その変換は行われません。ですから、当然にエラーになります。
【一番簡単なエラー回避策】
添付図のように、クエリのパラメータを変換してADOに渡すことです。
【ちょっと面倒なやり方】
http://msdn.microsoft.com/ja-jp/library/cc376629 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- PostgreSQL ポストグレにあるExcelファイルを開くには 1 2022/12/13 18:07
- カラオケ ADOさんみたいな歌い方は喉を痛めませんか? 2 2022/05/18 14:50
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Access(アクセス) Access で半角スペースと全角スペースの区別について 3 2022/11/05 23:54
- Excel(エクセル) 【vba】日付の形式が勝手に変わってしまう。 1 2022/09/29 10:54
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQL PLS-00103エラーについて
-
PL/SQLのコンパイルエラーにつ...
-
はじめまして!
-
ORA-01843: 指定した月が無効で...
-
「ORA-00907: 右カッコがありま...
-
PL/SQLでPLS-00201のエラー
-
ORA-06502のエラー
-
ストアドファンクションの実行
-
SQLLOADER
-
ACCESSでパススルークエリにパ...
-
PCC-S-02201エラーの対処を教え...
-
PL/PCLでORA-06502のエラー
-
データーベースリンク
-
DATABSE LINKについて
-
データベースのカラムの型がCHA...
-
ORA-14459: GLOBALキーワードが...
-
Oracleのエクスポートでエラー
-
インポートの実行結果で警告が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
ORA-01843: 指定した月が無効で...
-
PL/SQL PLS-00103エラーについて
-
はじめまして!
-
シェルスクリプトでオラクルの...
-
「ORA-00907: 右カッコがありま...
-
sqlのエラーハンドリングについ...
-
PCC-S-02201エラーの対処を教え...
-
SQLLOADER
-
ACCESSでパススルークエリにパ...
-
HAVING句でのBETWEEN演算子
-
PL/SQLでPLS-00201のエラー
-
ORA-14459: GLOBALキーワードが...
-
無効なSQL文の具体例を教えてく...
-
PL/SQLによるCREATE TABLE後のI...
-
pro*c で pl/sql に変数を渡す...
-
DATABSE LINKについて
-
ORA-06502のエラー
おすすめ情報