本当に初歩的な質問で申し訳ありませんが、どうしてもレコードの抽出ができません。SQLクエリーの区切り句がわかりません。
SQLquery = "SELECT * FROM mdata WHERE pcdate Between DDATA1 And DDATAE2 ORDER BY pcdate"
で、「パラメーターが少なすぎます。2を指定してください。」とのエラーがでます。
pcdata 倍精度実数
DDATA1 倍精度実数で、テキストボックスより数値指定、CDblで変換
DDATA2 倍精度実数で、テキストボックスより数値指定、CDblで変換
そこで、’や”をいろいろ付けて試してみたのですが、「型が一致しません。」とのエラーが出て、うまくレコードの抽出ができません。
本や、HELPファイルを覗いても解決できませんでした。
初歩的な構文であることはわかっています。どなたかアドバイスをお願い申し上げます。よろしくお願い申し上げます。
> DDATA1 倍精度実数で、テキストボックスより数値指定、CDblで変換
具体的なコードで示した方が伝わりやすいかも。(^^;
で…ざっと見た感じでは、SQL に変数の値を渡せていない気がしますね。
Dim s As String
s = Text1.Text
MsgBox "これは s です。"
MsgBox "これは 's' です。"
MsgBox "これは ""s"" です。"
MsgBox "これは " & s & " です。"
の、それぞれの違いということで。
> 「パラメーターが少なすぎます。2を指定してください。」とのエラーがでます。
そのメッセージだと、SQL のスペルミスの可能性がありますね。
SQL 中に、2 個の予期せぬキーワードがあり、それらが SQL の
パラメータ変数だと誤解されているのだと思います。
使用されているのは、DAO (mdb 接続)でしょうか?
その場合は、SQL を QueryDef オブジェクトに渡して、
Parameters プロパティを列挙してみてください。
ADO の場合は、Command オブジェクトの Parameters です。
各 Parameter の Name プロパティから、誤解の対象となった
キーワードがわかります。SQL を修正してみてください。
あるいは、SQL を修正するのでは、
.Prameters(…).Value = 値
のようにして、不足していたパラメータを渡し、そこから
Recordset を得るという方法もあります。
魔界の仮面弁士様、早速のお返事ありがとうございました。でも、自分自身大変な初心者なので、非常に申し訳なく感じています。お返事の内容が大変難しく、情けなく、また、非常に申し訳なく感じています。すみません。ただ、自分自身、自分のできる範囲でいろいろ思考錯誤はしています。
上記SQL文にブレークポイントを設けて、DDATE1とDDATE2のウォッチ式を見てみましたが、どちらも「倍精度型実数」で、値も20070601、20070630と正確に値は反映されてました。そこで、DDATE1の代わりに20070601、DDATE2に20070630の実際の数字を入れて、実行させたところ、きちんとレコードが抽出されました。ですので、DDATE1とDDATE2のところへ何か区切り句が必要でないかと想像したのですが、’や”の問題ではないのでしょうか?
文字列でのレコードの抽出時も、'" & W$ & "'と記述するのですよね。
本当に、初心者で申し訳ありません。
使用されているのは、DAO (mdb 接続)です。
その場合は、SQL を QueryDef オブジェクトに渡して、
Parameters プロパティを列挙してみてください。
ADO の場合は、Command オブジェクトの Parameters です。
とりあえず、上記アドバイスが実行できるよう努力してみます。
ありがとうございました。
>>> pcdata 倍精度実数
提示された SQL 中に、pcdata はありませんよ。pcdate はありましたが。
>>> DDATA2 倍精度実数で、テキストボックスより数値指定、CDblで変換
提示された SQL 中に、DDATA2 はありませんよ。DDATAE2 はありましたが。
どちらが正しいのかは分かりませんですが、いずれにしても
スペルミスでしょうから、きちんと合わせておいてくださいね。
---
> お返事の内容が大変難しく、
すみません、それはこちらの説明力不足のせいでもあるので。(^^;
とりあえず、わかる範囲だけ拾って読んでみてください。
また、わからない部分については、再度質問しなおしてみてください。
> 何か区切り句が必要でないかと想像したのですが、’や”の問題ではないのでしょうか?
区切りというよりも、「変数 SQLquery の内容」の問題です。
エラーメッセージを出しているのは、VB ではなく、データベース側です。
なので、VB 側の文法や DDATE1 変数の値は、さほど重要では無く、
むしろ、DB に渡した SQL 文字列の内容こそが重要なのです。
データベース側は、VB 内で定義した DDATA1/2 という変数を認識できないので、
SQL 文には「変数名」ではなく、「変数の値」が展開されなければなりません。
すなわち、
MsgBox SQLquery
を行った際、表示される内容が
〜 WHERE pcdate Between 20070601 And 20070630
となっていれば OK で、
〜 WHERE pcdate Between DDATA1 And DDATA2 〜〜
となっていれば NG だという事です。
対処方法はいろいろとありますが、たとえば、
Dim DDATA1 As Long, DDATA2 As Long
DDATA1 = 20070601
DDATA2 = 20070630
を扱いたいなら、値を埋め込むべきところに、
SQL = "SELECT * FROM mdata WHERE pcdate Between @from AND @to"
のように、何らかの記号(ここでは、@付きの名前)を書いておいて、
SQLquery = SQL
SQLquery = Replace(SQLquery, "@from", DDATA1)
SQLquery = Replace(SQLquery, "@to", DDATA2)
'結果は「SELECT * FROM mdata WHERE pcdate Between 20070601 AND 20070630」になる
のように、それぞれを置換して使うという手法があります。
あるいは、文字列を細かく連結していって、
SQLquery = "SELECT * FROM mdata WHERE pcdate Between " & CStr(DDATA1) & " And " & CStr(DDATAE2)
のように記述する手法もあります。
なお、上記の対処法は、pcdate 列が数値列の場合の話です。
pcdate 列が文字列型の場合は、型を合わせるために、
値の両端を「'」で囲まなければなりません。つまり、
〜 WHERE pcdate Between '20070601' And '20070630'
形式の文字列を生成するわけですが…その場合、単純に
Dim DDATA1 As String, DDATA2 As String
DDATA1 = Text1.Text
DDATA2 = Text2.Text
SQLquery = "SELECT * FROM mdata WHERE pcdate Between '" & CStr(DDATA1) & "' And '" & CStr(DDATAE2) & "'"
のように書くのは危険です。何故ならば、
DDATA1 = "abc'def"
のようなデータが渡された場合も考慮しなければならないからです。
まぁ、今回は数値型のようなので、そこまでは気にしなくても良いですけれども。
魔界の仮面弁士様、ありがとうございます。早速試してみたところ、うまくいきました。それと、DDATE1とDDATE2でした。すみませんでした。
結局、SQLqueryって文字列と考えればよいのですね。単純な考えですが、SQLqueryのウォッチ式を確認してもよかったのですね、それと、データーベースエンジンって本当にかしこいですね、関心ばかりしてます。文字列の中の文字と数値を判別してるのですよね。" & $W & "という書式で変数の中身を表示すると考えればよろしいのでしょうか?
本当に感激してます。ありがとうございました。
VB4からVB6に移行するにあたって、データーアダプターの設定などと、また違う構造になっているようですが、また、めげずにがんばってみます、ありがとうございました。
ツイート | ![]() |