質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

7097閲覧

JScriptでaccdbのレコードセットが取得できない。

Otazoman

総合スコア44

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/02/28 07:28

編集2018/03/01 11:00

前提・実現したいこと

JScriptでACCESSのaccdbに接続し、accdbから
レコードを引いてきてjsonファイルを出力するサンプルを
作成しようとしております。どうすればレコードセットを
正しく取得し値を引いてこれるようになるでしょうか。

発生している問題・エラーメッセージ

データベースの接続箇所は問題なく動いているようですが
レコードセットがうまく取得できず、値を取ってこれていないようです。
イメージ説明

該当のソースコード

JScript

1var database; 2onload = init; 3onunload = dbClose; 4 5function init() { 6 dbConnect(); //データベース接続(ここは正常に動作しています。) 7 var panelSql = 'SELECT * FROM m_panel WHERE (panel_active_flg=1) ORDER BY panel_order;'; 8 panelDisplay(panelSql); 9} 10 11function panelDisplay(mySql) { 12 try { 13 // データベースから検索パネルに設定する値を取得する。 14 // refer:http://dqn.sakusakutto.jp/2008/05/wshadojscriptaccess-mdbsql.html 15 // http://pgcenter.web.fc2.com/contents/javascript_mdb.html 16 var rs = new ActiveXObject("ADODB.Recordset"); 17 rs.ActiveConnection = database; 18 var rec = rs.Open(mySql); 19 var rJson = '['; 20 for(; !rs.EOF; rs.MoveNext() ) { 21 rJson = rJson + 22 '{ ' + 23 '"panel_id":' + rs.fields(0) + ',' 24 '"panel_name":' + rs.fields(1) + ',' + 25 '"panel_control_type":' + rs.fields(2) + ',' 26 '"panel_default_value":' + rs.fields(3) + ',' 27 '"panel_min_value":' + rs.fields(4) + ',' 28 '"panel_max_value":' + rs.fields(5) + ',' 29 '"panel_level_amount":' + rs.fields(6) + ',' 30 '"panel_level_amount":' + rs.fields(7) + ',' 31 '"panel_order":' + rs.fields(8) + 32 '}'; 33 } 34 rJson = rJson + ']'; 35 alert(rJson); 36 } catch (e) { 37 // エラーの場合 38 alert("Error(" + (e.number & 0xFFFF) + "):" + e.message); 39 }finally { 40 rs.Close 41 } 42} 43

試したこと

以下の様にコードを書き直して実行したところ、エラーは出ないものの
RecordCountが「-1」となっていてレコードセットを正しく取得できてい
ないようです。

JScript

1function panelDisplay(mySql) { 2 try { 3 // データベースから検索パネルに設定する値を取得する。 4 var rs = database.Execute(mySql); 5 database.CursorLocation = 3; 6 console.log(mySql); 7 console.log(rs.RecordCount); 8 var rJson = '['; 9 while (!rs.EOF) { 10 rJson = rJson + 11 '{ ' + 12 '"panel_id":' + rs.fields(0) + ',' 13 '"panel_name":' + rs.fields(1) + ',' + 14 '"panel_control_type":' + rs.fields(2) + ',' 15 '"panel_default_value":' + rs.fields(3) + ',' 16 '"panel_min_value":' + rs.fields(4) + ',' 17 '"panel_max_value":' + rs.fields(5) + ',' 18 '"panel_level_amount":' + rs.fields(6) + ',' 19 '"panel_level_amount":' + rs.fields(7) + ',' 20 '"panel_order":' + rs.fields(8) + 21 '}'; 22 rs.MoveNext(); 23 } 24 rJson = rJson + ']'; 25 } catch (e) { 26 // エラーの場合 27 alert("Error(" + (e.number & 0xFFFF) + "):" + e.message); 28 }finally { 29 rs.Close 30 } 31}

補足情報(FW/ツールのバージョンなど)

Windows10 Pro 64bit
ACCESS2016
JScriptについてはテキストエディタで作成

追加です。下記の情報を埋め込んだところ
STATE:は0、Count:は-1となっておりました。

Jscript

1console.log("STATE:" + rs.State); 2console.log("Count:" + rs.RecordCount);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Otazoman

2018/03/01 10:57

すいません。修正いたしました。
guest

回答2

0

ベストアンサー

VBScript派なので間違うかもしれません。

気になるのはdbConnect();での接続、本当に成功しているでしょうか。
「ODBC データソース アドミニストレーター」には、32bit用と64bit用があるので、
設定画面のテストはうまく行ってもJScript側から触れない64bit側の定義だったりしないでしょうか。

64bit用
%windir%\system32\odbcad32.exe
32bit用
%windir%\SysWOW64\odbcad32.exe

接続したらインスタンス(?)がdatabaseに入っている前提なのでしょうけど、
そこ、本当に大丈夫でしょうか。

あと、そのSELECT文は然るべき方法ではちゃんと動作するのかどうか。
SELECT *でなくちゃんとカラム名を書いたらどうかとか。
accdbということなので、Access上でクエリーとして定義したら動作する状態なのかとか。

ちゃんと動いているはず、できてるはず、を第三者が見てもわかるくらいに
検証結果をつけてもらわないと、おそらく原因の特定に至らないんじゃないかと思います。

投稿2018/03/01 13:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Otazoman

2018/03/02 01:49

ご指摘ありがとうございます。 1.SELECT文 SELECT文についてはACCESSのクエリー上では動作して レコードを引いてこれております。 2.dbconnect dbconectについては下記の通りです。 こちらについては接続はできているみたいです。 database = new ActiveXObject("ADODB.Connection"); var dbPath = "ACCESS_PATH;"; database.Open.Open('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbPath + "'); alert("データベースに接続しました。"); 3.ODBC ODBCの設定を確認したところ32bitの方で[構成]を クリックした際に[Unable to load odbcji32.dll] という メッセージが出ています。 もしかしてODBCのドライバに原因があるのでしょうか。 何度も申し訳ありませんがよろしくお願いいたします。
Otazoman

2018/03/02 05:22

ODBCドライバを入れなおしてみました。 Unable to load odbcji32.dll のエラーは消えております。 その状態でスクリプトを走らせました。 SQLは問題なくACCESSで動作しレコードも取れました。 SQL:SELECT * FROM m_panel WHERE (panel_active_flg=1) ORDER BY panel_order; レコードセットのオープンもできているようですが レコード件数で-1となっているようです。 STATE:1(rs.stateの結果) Count:-1(rs.Countの結果) 何とか先に進める情報があればご提供いただけると 幸いです。
退会済みユーザー

退会済みユーザー

2018/03/02 07:11

rs.Countにとらわれず、rs.Fields("~").Value にて値は取得できるようでしたら問題ないと思います。 rs.Count(rs.RecordCount)は(これまで)読み出した行数を示すことがあり、結果セットの全行数ではないことがあります。
Otazoman

2018/03/03 02:37

m6u様ありがとうございます。 rs.Fields(0).valueにて確認してみましたが 以下のエラーとなっております。 > BOF と EOF のいずれかが True になっているか、または現在のレコード> が削除されています。要求された操作には、現在のレコードが必要です。 テーブル自体にレコードは入っているので、やはりレコードセットを うまく取得できていないみたいです。 引き続き調べてみますが、何かヒントがあればご教示いただけると 助かります。
Otazoman

2018/03/03 05:00 編集

デバッグして捕まえてみると該当のrsにて下記のエラーがあるようでした。IE上の設定は変更済みです。 おそらくこれが原因でレコードセットが取れてきていないようです。 > ActiveCommand このコンピューターの安全性の設定により、 > ほかのドメインのデータ ソースへのアクセスは禁止されています。 Connectionについては以下のメッセージが出ているようです。 > パラメータの数が無効です 直接の原因は上記のパラメータの数が無効だと思うのですが このエラーの原因が分かりません。何かヒントがあれば ご教示いただけると幸いです。
退会済みユーザー

退会済みユーザー

2018/03/05 01:17

インターネット オプションでのセキュリティタブにて、信頼済みサイトに加える、のをお試しを。
Otazoman

2018/03/05 02:00 編集

ご回答ありがとうございます。ローカルで動かしているので 「ドメイン間でのデータソースのアクセス」にてダイアログを表示するように設定いたしております。 状況は変わらずです。
guest

0

結局SQLiteで接続しました。何とかACCESSで接続を
したかったのですが、にっちもさっちもいかずSQLiteで
32bit版ODBCドライバをインストールして一発で解決しました。

JScript

1var database; 2onload = init; 3onunload = dbClose(); 4 5function init() { 6 dbConnect(); 7 var panelSql = 'SELECT * FROM m_panel WHERE (panel_active_flg=1) ORDER BY panel_order;'; 8 panelDisplay(panelSql); 9} 10//データベースに接続する関数 11function dbConnect() { 12 var dbPath = "SQLITE_PATH"; 13 var driver = "DRIVER=SQLite3 ODBC Driver;Database=" + dbPath; 14 database = new ActiveXObject("ADODB.Connection"); 15 database.open(driver); 16 alert("データベースに接続しました。"); 17} 18//データベースを切断する関数 19function dbClose() { 20 database.Close(); 21 database = null; 22 alert("データベースを切断しました。"); 23} 24// パネルのパラメータ取得 25function panelDisplay(sql) { 26 try { 27 var rs = database.Execute(sql); 28 var recCount = rs.RecordCount 29// console.log("SQL:" + sql); 30// console.log("STATE:" + rs.State); 31// console.log("Count:" + rs.RecordCount); 32 var rJson = '[' + '\n'; 33 var j = 0; 34 for( ; !rs.EOF ; rs.MoveNext()) { 35 rJson = rJson + '\t' + '{ ' + '\n'; 36 for (var i = 0; i < rs.Fields.Count; i++){ 37 rJson = rJson + '\t\t' + '"' + rs.fields(i).Name + '":'; 38 if (i == rs.Fields.Count -1){ 39 rJson = rJson + '"' + rs.fields(i).Value + '"' +'\n'; 40 }else{ 41 rJson = rJson + '"' + rs.fields(i).Value + '",'+ '\n'; 42 } 43 } 44 if(j == recCount - 1 ){ 45 rJson = rJson + '\t' + '}' + '\n'; 46 }else{ 47 rJson = rJson + '\t' + '}' + ',' + '\n'; 48 } 49 j= j + 1; 50 } 51 rJson = rJson + ']'; 52 } catch(e1) { 53 if(rs != null){ 54 //レコードセットをクローズします 55 try {rs.Close();} catch(e2) {} 56 rs = null; 57 } 58 if(database != null){ 59 //ADOをクローズします 60 database.Close(); 61 database = null; 62 } 63 throw e1; 64 } 65 alert(rJson); 66 return rJson; 67}

投稿2018/03/05 03:35

編集2018/03/05 04:25
Otazoman

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問