- ベストアンサー
JavaScriptからAccess2003へのクエリが上手くいかない
Access2003での質問です。 JavaScriptからAccessのDBに接続しているのですが、 プログラム中からのクエリだと結果が得られない(BOFがTrueになっている模様) ですが、そのまま同じクエリをAccessを起動し、クエリを行うと正しい結果が返ってきます。 ちなみに、プログラムの中では他にいくつも同じようなクエリを飛ばしており、成功しています。 クエリを実行させる場所(他のクエリが成功している場所)を変えてもBOFとなります。 この症状の原因を教えていただきたいです、よろしくお願いします。 クエリ var sql = "select * from Table1 where Field1 like 'abc*'" var rcdSet = database.Execute(sql) →rcdSet(0)を参照しようとすると、BOFとなります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ADOを使う場合は、ドライバの文法に従います。Accessの文法ではありません。like のワイルドカードは % が正解です。 レコードセットを開いて、BOFが返ってくるなら、該当するレコードが存在しない、と言う事だと思います。下記に変更した場合、ちゃんとレコードが返ってきますか? (Field1がNull以外のレコードが全て選択されるはずです) var sql = "select * from Table1 where Field1 like '%'"; 下記で確認しましたが、うちの環境では、正常でしたよ。 (WindowsXP IE6) <html> <head> <title>ADO Test</title> </head> <body> <script type="text/javascript"> <!-- var mdbPath = "c:\\temp\\test.mdb" database = new ActiveXObject("ADODB.Connection"); database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=" + mdbPath +";"); var sql = "select * from Table1 where Field1 like 'abc%'"; var rcdSet = database.Execute(sql); var data = ''; while(!rcdSet.EOF){ data += rcdSet(0) + "<br>"; rcdSet.MoveNext; } rcdSet.Close(); database.Close(); document.write(data); // --> </script> </body> </html> ------------------------------------------------------------ >列名は実際は違うものですが、今回はField1とお考えください。 >その方がわかりやすいかと思いますので。 お気持ちはよく分かりますが、バグは本人が気付いていない場所にありますので、質問の際に問題部分を消してしまう可能性があります。変更は出来るだけ加えない方が良いですよ。 今回の件では、列名に不正な文字や、予約語が使われている可能性もありますので、その点をご確認下さい。 >ですが、この問題の原因を知りたいので引き続きお教えいただきたいです。 私も興味がありますので、可能な限り協力しますよ。 しかし、質問・補足の内容だけでは、情報不足で、原因特定は困難だと思います。 特に、今回のような難解な事例では、意外な場所に問題があったりするので、もう少し詳しい情報を書いて頂かないと、問題部分が見えてきません。 最低限、データベースを開いてから、値を取得するまでの実際のソースと、テーブルの内容(サンプルデータ)、は知りたいですね。
その他の回答 (2)
- shimix
- ベストアンサー率54% (865/1590)
MSのAccessDriverなら'abc*'でしょうかね・・ >前回とエラーが出ている位置は同じですし、 前回のエラーというのは何でしょう?BOF(EOFのこと?)になるという現象しか書かれていないのですが・・。 >var sql = "select * from Table1 where Field1 like 'abc*'" Field1というのは、このままの列名なんですよね?(念のため確認) var sql = "select * from Table1 where Field1 like \"abc*\"" でもダメですか?
補足
前回のエラーとは 「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」 のことです。確かめてみたらBOFがTrueになっていたので、 質問時のような書き方をしてしまいました。 列名は実際は違うものですが、今回はField1とお考えください。 その方がわかりやすいかと思いますので。 前回の書き込み時にいじっていたら「パレメータが少なすぎます・・・」 というエラーが出るようになったと書きましたが、これは解決しました。 原因はダブルクォーテーションのようです。 文字列で渡す際に\"としますが、この\が悪いのかもしれません。 それで、それを直すとやはり最初の「BOFとEOFの~」が出ます。 レコードは存在しますし、もう意味がわかりません。 今作っているプログラムでは進めないと仕方ないので、 違う方法でとりあえずほしいものは抽出できています。 ですが、この問題の原因を知りたいので引き続きお教えいただきたいです。 よろしくお願いします。
- shimix
- ベストアンサー率54% (865/1590)
JavaScriptからAccessに繋ぐときのドライバがどうなるのか不明にして知らないのですが var sql = "select * from Table1 where Field1 like 'abc%'" ではダメですか?SQLの違いを吸収してしまうドライバだと一般的なSQLで書かないといけなかった気がします。
お礼
色々といじっていたら違うエラーが出るようになりました。 [Microsoft][ODBC Microsoft Access Driver]パラメータが少なすぎます。1を指定しください。 前回とエラーが出ている位置は同じですし、 Accessのクエリから実行すると成功する点も同じです。 Microsoftのサポートページには 「この現象は、表示するデータベースに SELECT ステートメントで 指定したフィールド名が存在しない場合に発生します。 ほとんどの場合が、クエリの入力ミスによるものです。 」 と書かれていますが、この場合には当てはまらないような気がします。 補足になりますが、abcの後に出現する可能性のある文字列は そのほとんどが一文字の英字と二文字の数字です。 しかし、まれに漢字やらカタカナやらがくることもあるのでやっかいです。 文字列の先頭がabcのもの抽出できればよいのです、 どうかよろしくお願いします。
補足
早い回答ありがとうございます。 足りない部分があったので補足します。 繋ぐときの文は以下の通りです。 database = new ActiveXObject("ADODB.Connection"); database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\\db1.mdb;"); shimixさんの通りやってみましたが、ダメでした。 Accessから直接やってみても通りませんでした。
お礼
レスありがとうございます。 結論から言うとお教え下さった文で成功しました^^; var sql = "select * from Table1 where Field1 like 'abc%'" shimixさんに最初に教えていただいた文と全く同じだと思うのですが 残念ながら質問時とはソースが大分変ってしまっているので venzouさんの仰る通り私の気付いていない箇所が原因だったのかもしれません。 DB自体には手を加えていないので列名に関しては間違っていないと思います。 実際のデータやソースを出すのは憚られたので、改変したのですが それがよくなかったというのを思いしりました。 以降はこの点を踏まえて質問したいと思います。 手間をかけさせてしまいすいませんでした。 最後までありがとうございました。