アプリ版:「スタンプのみでお礼する」機能のリリースについて

配列を使ってクエリの値を変数にしたいと考えていますが、
変数として見ず、文字列としてみているようです。


*********test.asp***************
kyoku1 = Request.Form("kyoku1")
kyoku2 = Request.Form("kyoku2")
kyoku3 = Request.Form("kyoku3")
(kyoku1~3は前のページのフォームから値を持ってきています。)

Dim k(2)
Dim m(2)
Dim jj

jj = 0

k(0) = kyoku1
k(1) = kyoku2
k(2) = kyoku3

m(0) = kyokumei1
m(1) = kyokumei2
m(2) = kyokumei3

Set db=Server.CreateObject("ADODB.Connection")
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.ConnectionString = Server.MapPath("DB名")
db.open

Do While j < 3
Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='"&k(jj)&"')")
m(0) = rs.Fields.Item("曲名")
j = j + 1
jj = jj + 1
Loop

Response.Write(" & kyokumei1 & ")
Response.Write(" & kyokumei2 & ")
Response.Write(" & kyokumei3 & ")

宜しくお願い致します。

A 回答 (7件)

生成されたコードに問題がないのであればEOF/BOFになる可能性が低いのですが ・・・



EOF/BOFになるのは WHERE句の指定が不正でレコードを特定できない場合に起きると思います
    • good
    • 0

k(j)で渡していますが jの値は適正ですか?



for j=0 to 2
Response.Write( "SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='" & k(j) & "')<br>" )
Next
を実行して 適切なSQL文になっているのか確認しましょう
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
返信遅れて申し訳ありません。

実行しましたが、以下のように問題なくなっていると思います。

SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='1000')
SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='10099')
SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='12312')

がうまくいきません。
どうすればいいのでしょうか。
宜しくお願い致します。

お礼日時:2008/02/14 11:19

Dim宣言で2までしか宣言していないのに jjが3ならエラーになって当然ですよ


<!-- 下記3行はOK -->
Response.Write("" & m(0) & "<br>" )
Response.Write("" & m(1) & "<br>" )
Response.Write("" & m(2) & "<br>" )
<!-- この行はエラー -->
Response.Write("" & m(3) & "<br>" )
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
インデックスの範囲のエラーは解消致しました。
ありがとうございました。

やはりうまくいきません。

(1)Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='" & k(j) & "')")
(2)Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='" & k(0) & "')")

(2)だと問題ないのですが、(1)だとエラーになります。
エラーメッセージは以下のようになっています。

BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。

また、最初に書きました、以下のコードもうまくループしません。
上記の(2)にしたとき、
m(j) = rs.Fields.Item("曲名")
Response.Write(""& m(j) &"<br>")
j = j + 1

m(0)の値は出力されますが、m(1)と続いていきません。
m(0)の値はLOOPの回数表示されます。

宜しくお願い致します。

お礼日時:2008/01/31 16:10

SQLを組み立ててResponse.Writeで組み立てたSQL文を出力した際に



SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号='k(jj)'))
といった具合になってしまうということでしょうか

k(jj)の前後の&は & k(jj) & といった具合に スペースを空けたほうがいいですよ

エラーになっているのであればその内容などを投稿してみてはいかがでしょう
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そうなります。

Response.Write(""& k(0) &"<br>")
Response.Write(""& k(jj) &"<br>")

上の1行目だと問題ないのですが、
2行目に変更すると、

「インデックスが有効範囲にありません。: '3'」

のメッセージになります。
スペースのご指摘ありがとうございました。

宜しくお願い致します。

お礼日時:2008/01/31 15:12

でしたら ループのなかでm(j)に代入すればいいのでは



m(0)= rs.FieldsItem("曲名")を m(j)=rs.FieldsItem("曲名")
として
for j = 0 to 2
  Response.Write( m(j) )
next
といった具合で …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まだその前の段階で、
m(j)

k(jj)
も配列としてみずに、文字列としてみているようです。
何か書き方が違うのでしょうか。
宜しくお願い致します。

お礼日時:2008/01/31 11:52

すいません、何がどうなればいいのか、これだけでは、


イマイチ見えないのですが、「クエリの値」の値とは、
Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='"&k(jj)&"')")
でSQL実行した後の「曲名」を指しているということでしょうか?

それから、kyokumei1~kyokumei3は、
m(0) = kyokumei1
m(1) = kyokumei2
m(2) = kyokumei3
のように代入してますが、そもそもmという配列に
kyokumei1~kyokumei3を代入する意味があるんでしょうか?
それとも、他で使われているのでしょうか?

さらに、Set rs = ...... の「rs」は、レコードセットだと
思いますが、ADORecordSetでよろしいですか?

UPするソースコードと「何が」「どうなってしまう」という
現象を具体的に明示して頂くと、正確な回答がしやすいので、
もう少し、質問したい箇所のソースコードを整備したうえで
補足頂けますか?

よろしくお願いします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
言葉足らずで申し訳ありません。
補足させていただきます。

>すいません、何がどうなればいいのか、

フォームで番号を入力させて、
その値をtest.aspに持ってきて、
ACCESSでクエリをさせて、
番号に対して、曲名をひっぱってきます。
そして、その曲名を表示させたいと考えています。

>「クエリの値」の値とは、
>Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE >((テーブル名.番号)='"&k(jj)&"')")
>でSQL実行した後の「曲名」を指しているということでしょうか?
「曲名」と「番号(k(jj))」を変数にしたいと考えています。

>のように代入してますが、そもそもmという配列に
>kyokumei1~kyokumei3を代入する意味があるんでしょうか?
>それとも、他で使われているのでしょうか?
申し訳ありません。
m(0) = rs.Fields.Item("曲名")

m(jj) = rs.Fields.Item("曲名")
の間違いでした。

>さらに、Set rs = ...... の「rs」は、レコードセットだと
>思いますが、ADORecordSetでよろしいですか?
こちらは、他のページでも使用していますので、
問題ないかと思います。

もともと以下のコードで作成しましたが、
長すぎてなんとかするために配列を使用しようと考えました。

************元のコード************************
Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((((テーブル名.番号)='" & kyoku1 & "')")
kyokumei1 = rs.Fields.Item("曲名")
Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((((テーブル名.番号)='" & kyoku2 & "')")
kyokumei2 = rs.Fields.Item("曲名")
Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='" & kyoku3 & "')")
kyokumei3 = rs.Fields.Item("曲名")
Set rs = db.Execute("SELECT テーブル名.* FROM テーブル名 WHERE ((テーブル名.番号)='" & kyoku4 & "')")
kyokumei4 = rs.Fields.Item("曲名")

Response.Write(" & kyokumei1 & ")
Response.Write(" & kyokumei2 & ")
Response.Write(" & kyokumei3 & ")
Response.Write(" & kyokumei4 & ")

************元のコード************************

宜しくお願い致します。

お礼日時:2008/01/31 11:01

Whereの引数が数値なら 『'』で括ってしまうとダメだと思いますよ



WHERE ((テーブル名.番号)=" & k(jj) & ")" )
といった具合に ='"を ="に "')"を ")"に変更してみてください
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
引数ですが、
DBはアクセスを使用しており、
番号のデータ型はテキスト型にしています。
ですので、そこは問題ないと思います。
配列を使わずに代入するだけなら、
問題なく動作もします。
宜しくお願いいたします。

お礼日時:2008/01/31 09:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!