電子書籍の厳選無料作品が豊富!

DB(Access)から取得した内容を配列に格納し、その内容を取り出すプログラムを
以下のように書いてみました。
whileループ内の alert("ループの中=" + data_array[i]);
では配列の中の値が参照できるのですが
whileループの外で
for(var i=0;i < data_array.length; i++){
alert("ループの外:" + data_array[i]);
}
配列の中身を表示させようとしたところdata_array.length の長さが0になっており
配列の中身が参照できない状態です。なにが原因かわかりますでしょうか。


<html>
<script language="javascript" type="text/javascript">

function dbSearch() {
var sql="select * from URL where flg=0";
var database = dbConnect();
var recordSet = database.Execute(sql);

var data_array = new Array();

while (!recordSet.EOF){
data_array[i] = recordSet(0);
alert("ループの中=" + data_array[i]);
recordSet.MoveNext();
}

alert("長さ=" + data_array.length);

for(var i=0;i < data_array.length; i++){
alert("ループの外:" + data_array[i]);
}

database.Close();

return;
}

//データベースに接続
function dbConnect() {
var database = new ActiveXObject("ADODB.Connection");
database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\\test.mdb;");
return database;
}
</script>

<body>
<input type="button" value="DB接続" onclick="dbSearch()">
</body>
</html>

A 回答 (6件)

私もNo5さんと同じ事を思いましたけど、WSH環境のJScriptだとADODBを呼べなかったので試せてません。

自分のPCにIISを入れてまで試す気にならない。ExcelVBA+ADOではOKでした。

とりあえず、
data_array[i] = recordSet(0)+"";
でどうでしょう?
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
recordSet(0)+"";
とすることで解決できました。
当初、recordSet(0).toString();
とかやっていたのですがrecordSetオブジェクトがtoString()を
サポートしていなかったので困っていました。
空文字を付ける方法もあるんですね。ありがとうございました。

お礼日時:2011/10/10 13:06

#4さんの指摘した箇所は合ってると思いますので気になさらないでください。


Execute()の結果はSQLの検索結果の値ではなく、Recordsetクラスというもののオブジェクトです。
これは簡単に言うとSQL実行結果を表としてみたときの行にあたるもので、(n)をつけるとその行のn列目の値が帰ってきます。
count_sqlは"SELECT count(*) FROM ~"の実行結果なので、検索結果は1行1列の表になります。
したがって、count_sqlは次の行を参照するようにするMoveNext()をExecute()実行後に呼んでいないため、count_sql(0)とすることでその値が取得できます。

それよりも、
 data_array[i] = recordSet(0);
の部分ですが、ここに入っているのは文字列でしょうか。
ADO+JavaScriptは実際にやったことが無いので(ADO自体は経験がありますが)確証が持てないのですが、もし文字列だと、上の式ではRecordset内の文字列を指す参照のコピーが行われているだけで文字列の複製は行われていない、ということが考えられます。その場合、MoveNext()で次の行に移った場合、その参照している文字列が書き換わるとか、行がなくなったときに参照している文字列が空になるとかありそうなのですが……考えすぎかなぁ。
    • good
    • 0
この回答へのお礼

#6さんの方法で解決いたしました。
御回答ありがとうございました。

お礼日時:2011/10/10 13:07

var record_count = database.Execute(count_sql); <-ここのrecord_count



var recordSet = database.Execute(sql);

var data_array = new Array();

for(var i=0; i<record_count(0);i++){ <-ここのrecord_count 
data_array[i] = recordSet(0);

  :
  :

よーーく見て、記述方法正しい?
    • good
    • 0
この回答へのお礼

#6さんの方法で解決いたしました。
御回答ありがとうございました。

お礼日時:2011/10/10 13:07

ここかな?



while (!recordSet.EOF){
data_array[i] = recordSet(0);
alert("ループの中=" + data_array[i]);
recordSet.MoveNext();
}
の「前で」iを宣言していないから、ここで変数iが作られる。
でも、iに値を設定していないからdata_array[i] = …の部分で変なところに値が格納される。
どこだか分からないところに格納しているから、lengthの値が0のまま……?

……というか、iの値加算していないから、ループ中同じ場所に格納され続けているようですが。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
dbSearch() の中身を以下のように修正しました。
これで試したところdata_array.lengthが3となり期待通り
の数になったのですが2回目のループで data_array
の中身を表示させたところ何も表示されませんでした。
1回目のループの中ではdata_arrayの中身は表示される
のですが何かおかしいのでしょうか。

function dbSearch() {
var count_sql = "select count(*) from URL where flg=0";
var sql="select * from URL where flg=0";
var database = dbConnect();
var record_count = database.Execute(count_sql);
var recordSet = database.Execute(sql);


var data_array = new Array();

for(var i=0; i<record_count(0);i++){
data_array[i] = recordSet(0);

alert("ループの中=" + data_array[i]);
recordSet.MoveNext();
}

alert("長さ=" + data_array.length);

for(var k=0;k < data_array.length; k++){
alert("ループの外:" + data_array[k]);
}

database.Close();

return;
}

お礼日時:2011/10/09 21:28

最初のwhileのところ


while (!recordSet.EOF){
data_array[i] = recordSet(0);
alert("ループの中=" + data_array[i]);
recordSet.MoveNext();
}
iは、何はいってる?
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
dbSearch() の中身を以下のように修正しました。
これで試したところdata_array.lengthが3となり期待通り
の数になったのですが2回目のループで data_array
の中身を表示させたところ何も表示されませんでした。
1回目のループの中ではdata_arrayの中身は表示される
のですが何かおかしいのでしょうか。

function dbSearch() {
var count_sql = "select count(*) from URL where flg=0";
var sql="select * from URL where flg=0";
var database = dbConnect();
var record_count = database.Execute(count_sql);
var recordSet = database.Execute(sql);


var data_array = new Array();

for(var i=0; i<record_count(0);i++){
data_array[i] = recordSet(0);

alert("ループの中=" + data_array[i]);
recordSet.MoveNext();
}

alert("長さ=" + data_array.length);

for(var k=0;k < data_array.length; k++){
alert("ループの外:" + data_array[k]);
}

database.Close();

return;
}

お礼日時:2011/10/09 21:28

while (!recordSet.EOF){


data_array[i] = recordSet(0);
alert("ループの中=" + data_array[i]);
recordSet.MoveNext();
}

(1) i が宣言されていない(これ自体はご存じの通り必須では無いですが)
(2) i が初期化されていない
(3) i がカウントアップされていない

ということで、
> data_array[i] = recordSet(0);
は、data_array[null] = recordSet(0); ということで、配列としての長さは0です。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
dbSearch() の中身を以下のように修正しました。
これで試したところdata_array.lengthが3となり期待通り
の数になったのですが2回目のループで data_array
の中身を表示させたところ何も表示されませんでした。
1回目のループの中ではdata_arrayの中身は表示される
のですが何かおかしいのでしょうか。

function dbSearch() {
var count_sql = "select count(*) from URL where flg=0";
var sql="select * from URL where flg=0";
var database = dbConnect();
var record_count = database.Execute(count_sql);
var recordSet = database.Execute(sql);


var data_array = new Array();

for(var i=0; i<record_count(0);i++){
data_array[i] = recordSet(0);

alert("ループの中=" + data_array[i]);
recordSet.MoveNext();
}

alert("長さ=" + data_array.length);

for(var k=0;k < data_array.length; k++){
alert("ループの外:" + data_array[k]);
}

database.Close();

return;
}

お礼日時:2011/10/09 20:40

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