- ベストアンサー
配列に格納した値が保存されない
- DB(Access)から取得した内容を配列に格納し、その内容を取り出すプログラムを以下のように書いてみました。
- whileループの外で配列の中身を表示させようとしたところ、data_array.lengthの長さが0になっており、配列の中身が参照できない状態です。
- これは、data_arrayの要素に値を代入する前にdata_array[i]を使用しているためです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
私もNo5さんと同じ事を思いましたけど、WSH環境のJScriptだとADODBを呼べなかったので試せてません。自分のPCにIISを入れてまで試す気にならない。ExcelVBA+ADOではOKでした。 とりあえず、 data_array[i] = recordSet(0)+""; でどうでしょう?
その他の回答 (5)
- hitomura
- ベストアンサー率48% (325/664)
#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()で次の行に移った場合、その参照している文字列が書き換わるとか、行がなくなったときに参照している文字列が空になるとかありそうなのですが……考えすぎかなぁ。
お礼
#6さんの方法で解決いたしました。 御回答ありがとうございました。
- ToOrisugaru
- ベストアンサー率28% (80/280)
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); : : よーーく見て、記述方法正しい?
お礼
#6さんの方法で解決いたしました。 御回答ありがとうございました。
- hitomura
- ベストアンサー率48% (325/664)
ここかな? while (!recordSet.EOF){ data_array[i] = recordSet(0); alert("ループの中=" + data_array[i]); recordSet.MoveNext(); } の「前で」iを宣言していないから、ここで変数iが作られる。 でも、iに値を設定していないからdata_array[i] = …の部分で変なところに値が格納される。 どこだか分からないところに格納しているから、lengthの値が0のまま……? ……というか、iの値加算していないから、ループ中同じ場所に格納され続けているようですが。
お礼
御回答ありがとうございます。 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; }
- ToOrisugaru
- ベストアンサー率28% (80/280)
最初のwhileのところ while (!recordSet.EOF){ data_array[i] = recordSet(0); alert("ループの中=" + data_array[i]); recordSet.MoveNext(); } iは、何はいってる?
お礼
御回答ありがとうございます。 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; }
- notnot
- ベストアンサー率47% (4900/10358)
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です。
お礼
御回答ありがとうございます。 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; }
お礼
御回答ありがとうございます。 recordSet(0)+""; とすることで解決できました。 当初、recordSet(0).toString(); とかやっていたのですがrecordSetオブジェクトがtoString()を サポートしていなかったので困っていました。 空文字を付ける方法もあるんですね。ありがとうございました。