ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:mild_cocoa 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となります。
質問投稿日時:08/02/14 19:40
質問番号:3775836
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:venzou 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とお考えください。
>その方がわかりやすいかと思いますので。

お気持ちはよく分かりますが、バグは本人が気付いていない場所にありますので、質問の際に問題部分を消してしまう可能性があります。変更は出来るだけ加えない方が良いですよ。

今回の件では、列名に不正な文字や、予約語が使われている可能性もありますので、その点をご確認下さい。


>ですが、この問題の原因を知りたいので引き続きお教えいただきたいです。

私も興味がありますので、可能な限り協力しますよ。
しかし、質問・補足の内容だけでは、情報不足で、原因特定は困難だと思います。

特に、今回のような難解な事例では、意外な場所に問題があったりするので、もう少し詳しい情報を書いて頂かないと、問題部分が見えてきません。

最低限、データベースを開いてから、値を取得するまでの実際のソースと、テーブルの内容(サンプルデータ)、は知りたいですね。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/02/16 13:59
回答番号:No.3
この回答へのお礼レスありがとうございます。
結論から言うとお教え下さった文で成功しました^^;
var sql = "select * from Table1 where Field1 like 'abc%'"

shimixさんに最初に教えていただいた文と全く同じだと思うのですが
残念ながら質問時とはソースが大分変ってしまっているので
venzouさんの仰る通り私の気付いていない箇所が原因だったのかもしれません。
DB自体には手を加えていないので列名に関しては間違っていないと思います。

実際のデータやソースを出すのは憚られたので、改変したのですが
それがよくなかったというのを思いしりました。
以降はこの点を踏まえて質問したいと思います。
手間をかけさせてしまいすいませんでした。

最後までありがとうございました。

回答

 

回答者:shimix MSのAccessDriverなら'abc*'でしょうかね・・

>前回とエラーが出ている位置は同じですし、

前回のエラーというのは何でしょう?BOF(EOFのこと?)になるという現象しか書かれていないのですが・・。

>var sql = "select * from Table1 where Field1 like 'abc*'"

Field1というのは、このままの列名なんですよね?(念のため確認)

  var sql = "select * from Table1 where Field1 like \"abc*\""

でもダメですか?
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/02/15 15:03
回答番号:No.2
この回答への補足前回のエラーとは
「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」
のことです。確かめてみたらBOFがTrueになっていたので、
質問時のような書き方をしてしまいました。

列名は実際は違うものですが、今回はField1とお考えください。
その方がわかりやすいかと思いますので。

前回の書き込み時にいじっていたら「パレメータが少なすぎます・・・」
というエラーが出るようになったと書きましたが、これは解決しました。
原因はダブルクォーテーションのようです。
文字列で渡す際に\"としますが、この\が悪いのかもしれません。

それで、それを直すとやはり最初の「BOFとEOFの〜」が出ます。
レコードは存在しますし、もう意味がわかりません。
今作っているプログラムでは進めないと仕方ないので、
違う方法でとりあえずほしいものは抽出できています。

ですが、この問題の原因を知りたいので引き続きお教えいただきたいです。
よろしくお願いします。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答10pt

回答者:shimix JavaScriptからAccessに繋ぐときのドライバがどうなるのか不明にして知らないのですが

  var sql = "select * from Table1 where Field1 like 'abc%'"

ではダメですか?SQLの違いを吸収してしまうドライバだと一般的なSQLで書かないといけなかった気がします。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/02/14 19:49
回答番号:No.1
この回答への補足早い回答ありがとうございます。
足りない部分があったので補足します。

繋ぐときの文は以下の通りです。
database = new ActiveXObject("ADODB.Connection");
database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\\db1.mdb;");

shimixさんの通りやってみましたが、ダメでした。
Accessから直接やってみても通りませんでした。
この回答へのお礼色々といじっていたら違うエラーが出るようになりました。
[Microsoft][ODBC Microsoft Access Driver]パラメータが少なすぎます。1を指定しください。

前回とエラーが出ている位置は同じですし、
Accessのクエリから実行すると成功する点も同じです。
Microsoftのサポートページには
「この現象は、表示するデータベースに SELECT ステートメントで
指定したフィールド名が存在しない場合に発生します。
ほとんどの場合が、クエリの入力ミスによるものです。 」
と書かれていますが、この場合には当てはまらないような気がします。


補足になりますが、abcの後に出現する可能性のある文字列は
そのほとんどが一文字の英字と二文字の数字です。
しかし、まれに漢字やらカタカナやらがくることもあるのでやっかいです。
文字列の先頭がabcのもの抽出できればよいのです、
どうかよろしくお願いします。
 
最新から表示回答順に表示良回答のみ表示