![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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>
No.6ベストアンサー
- 回答日時:
私もNo5さんと同じ事を思いましたけど、WSH環境のJScriptだとADODBを呼べなかったので試せてません。
自分のPCにIISを入れてまで試す気にならない。ExcelVBA+ADOではOKでした。とりあえず、
data_array[i] = recordSet(0)+"";
でどうでしょう?
御回答ありがとうございます。
recordSet(0)+"";
とすることで解決できました。
当初、recordSet(0).toString();
とかやっていたのですがrecordSetオブジェクトがtoString()を
サポートしていなかったので困っていました。
空文字を付ける方法もあるんですね。ありがとうございました。
No.5
- 回答日時:
#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()で次の行に移った場合、その参照している文字列が書き換わるとか、行がなくなったときに参照している文字列が空になるとかありそうなのですが……考えすぎかなぁ。
No.4
- 回答日時:
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);
:
:
よーーく見て、記述方法正しい?
No.3
- 回答日時:
ここかな?
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;
}
No.2
- 回答日時:
最初の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;
}
No.1
- 回答日時:
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript 【jquery】EasyUIのSubGridにMySQLのテーブルデータを表示&編集にしたい 5 2022/05/02 13:10
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
二次元配列を使って順位をだす...
-
同じIDで定義した要素の配列を...
-
Googleスプレッドシートとスク...
-
JavaScriptでの動的な多次元配...
-
どうすればresponseText結果を...
-
C#テキストボックスの文字を配...
-
ページ内のみの検索窓(?)
-
javascript 変数名の連結をしたい
-
配列を作って総当たりで距離を...
-
idを使わずにonclickで自身の要...
-
ActiveXobjectが作成できない
-
関数でy=g(x)のgとは何の略です...
-
乗換案内 VBAで操作したい
-
javascriptの基本的なことだと...
-
window.openでタイトル名の指定
-
Boolean型配列中のTrueの有無を...
-
JavaScriptで、現在日時から100...
-
DOM要素を削除しても、イベント...
-
【Tabキー】特定の範囲内だけで...
-
Javascriptで定期的にF5を押す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
C#テキストボックスの文字を配...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
二次元配列を使って順位をだす...
-
javascriptで行を抽出したいです。
-
javascriptからphpに配列データ...
-
多次元配列から最大値を1行また...
-
Perlの配列をJavaScriptに渡せ...
-
JSONデータを50音順でソートしたい
-
どうすればresponseText結果を...
-
バナーのランダム表示(複数、...
-
JavaScriptでの動的な多次元配...
-
JavaScriptからPHPに配列を渡す...
-
javascript 省略した記述と思わ...
-
【Google Apps Script】コード...
-
javascriptを用いて作成された...
-
[JS] setAttributeで保存される...
-
javascriptで2つのArrayの...
-
配列について、その要素を並べ...
おすすめ情報