# リモートクエリーデータベースコントロール

マニュアル > コントロールリファレンス > その他 > # リモートクエリーデータベースコントロール |

| リモートクエリーデータベースコントロール(RemoteQueryDB)
プロパティ | メソッド | イベント
リモートクエリーデータベースコントロールは、SQL使用してデータベースからデータを取得したり、データベースへデータを書き込んだりするためのコントロールです。 サーバを介してデータベースへ接続します。 サーバを介してDBへ接続するため、サーバを起動するPCのみODBCの設定を行います。 ブラウザを起動する各PCにはODBCの設定は必要ありません。 また、ブラウザ/サーバ間はインターネットプロトコル（TCP/IP）でやり取りされるため、どのような環境からでもデータベースへアクセスする事ができます。
| 大量なデータの取得など、処理時間がかかるような場合には、タイムアウトにより処理が失敗することがあります。そのような場合には、ルートプロパティのPSTimeOutプロパティを処理時間よりも長くとるように調整してください。
| データベースへ接続するためのコントロールとして、本コントロールの他に、ダイレクトクエリーデータベースコントロールがありますが、特に理由がなければリモートクエリーデータベースコントロールを使用してください。
接続の方法
データベースへの接続はConnectメソッドによって行います。 Connectメソッドは2つの接続方法をサポートしています。 ■構文1 Connect(AcrionName); ■構文2 Connect (DSN,DataBase,User,Password) 構文1では、サーバに定義したクエリーサーバアクション名を指定して接続を行います。 構文1で接続する場合、サーバにクエリーサーバアクションを設定する必要があります。設定方法については本項の「クエリーサーバの設定」を参照して下さい。 構文2ではデータベースへ接続するためのパラメータを直接指定します。 この方法ではクエリーサーバアクションの設定は不要です。 なお、構文1と構文2ではコネクションの考え方に大きな違いがあります。 構文1の場合、サーバに定義したクエリーサーバがDBに接続します。 複数のブラウザからサーバに接続した場合でもDBとのコネクションは1つのみです。 複数のブラウザから接続された場合、クエリーサーバが同期をとってDBとのやりとりを行うため、 構文2より多少パフォーマンスが落ちる場合がありますが、DBへの負荷は構文2より少なくなります。 構文2の場合、複数のブラウザからサーバに接続した場合、サーバはブラウザの数だけDBとのコネクションを生成します。 コネクションを複数持つため、複数のブラウザから接続された場合でも同期をとらずにDBとのやりとりができるため高速に処理が行える可能性があります。 ただし、構文1と比較してDBへの負荷が増加します。
| 特に理由がなければ構文1の方法を推奨します。
クエリーサーバーの設定
Connectメソッドを用いて構文1で接続する場合、サーバクエリーサーバアクションを設定する必要があります。 クエリーサーバの設定は簡単です。 1.サーバを起動 2.左側のツリーの「Action」を右クリックしメニューから「追加」「アクション」を選択 3.アクションの追加ダイアログから「クエリーサーバ」を選択し、「OK」を押す 4.作成された「A01」アクションを右クリックし「プロパティ」を選択 5.ODBC設定タブでデータソースを選択 ODBCの設定については、「ODBCの設定」を参照して下さい。
ODBCの設定
リモートクエリデータベースコントロールを使用するには、サーバを起動するPCにODBCの設定が必要になります。 ODBCの設定はデータベース毎に行う必要があります。下記の例では、「controls_dbsample.mdb」を「DBSAMPLE」というデータソース名で設定しています。 ※ODBCドライバはDBごとに別途導入して頂く必要があります。
1．選択ボタンを押下する |  | 2．データソースの選択ボタンを押下する
3．新規作成ボタンを押下する。ただし、すでに登録済みである場合は、一覧から選択する。 |  | 4．データソースの型を選択して次へボタンを押下する。
5．使用するドライバを選択して、次へボタンを押下する |  | 6．次へボタンを押下する
7．データソース名を任意の内容で指定し、mdbファイルを選択して、OKボタンを押下する |  | 8．追加されたデータソースを選択し、OKボタンを押下する
| ODBCドライバごとに設定が異なるため、環境にあった設定を行ってください。
QuerySQLメソッドの使い方
QuerySQLはSQLを実行してレコードを取得する重要なメソッドです。下記のようなテーブル（テーブル名「TABLE1」）に接続する場合を例に解説します。
ID | TESTNAME | TESTRESULT | TESTTIME
1 | Test1 | T | 2005/1/1 12:30:00
2 | Test2 | F | 2005/1/1 14:25:00
3 | Test3 | T | 2005/1/1 15:15:00
    var vFieldNum, vRecordNum, vFieldName, vFieldType, vData;
    if (!this.QuerySQL("SELECT * FROM TABLE1", vFieldNum, vRecordNum, vFieldName, vFieldType, vData))
    {
     ::OpenMsg(this.GetLastError());	// 失敗した場合はGetLastErrorでエラーコメントを表示
     return;
    }
上記のように、SQL文"SELECT * FROM TABLE1"を、QuerySQLメソッドによってデータベースに問い合わせます。 処理が成功すると「vFieldNum, vRecordNum, vFieldName, vFieldType, vData」にテーブルの情報が格納されます。
vFieldNum | フィールド数、4が格納されます。
vRecordNum | レコード数、3が格納されます。
vFieldName | データベースで定義したフィールド名がc("ID", "TESTNAME", "TESTRESULT", "TESTTIME")のように格納されます。
vFieldType | 各フィールドのSQLタイプがc(4, 12, 4, -7, 11)のように格納されます。
vData | 下記を参照下さい。
vDataには全レコードの内容が２次元配列（vData[列, 行]）で格納されます。 スクリプトのcキーワードであらわすと下記のようになります。
    c( c(1,2,3),
       c(“Test1”,”Test2”,”Test3”),
       c(T,F,T),
       c(#2005/1/1 12:30:00#, #2005/1/1 14:25:00#, #2005/1/1 15:15:00#));
各セルのデータを抜き出すには下記のように配列のインデックスを指定します（インデックスや行列は0から数えます）。 vData[列, 行]
    var a = vData[0,0];  // 0列0行目のデータ（1）
    var a = vData[0,1];  // 0列1行目のデータ（2）
    var a = vData[1,2];  // 1列2行目のデータ（"TEST3"）
特定の列のデータを配列から抜き出すには下記のようにします。
    var a = vData[0, ];   // 0列目の全データ
    var a = vData[1, ];   // 1列目の全データ
特定の行のデータを配列から抜き出すには下記のようにします。
    var a = vData[, 1];   // 1行目の全データ
    var a = vData[, 2];   // 2行目の全データ
そのほか、スクリプトでは様々な配列の扱いができます。下記は例です。 例
例1) vData[0, ]は0列目、つまりc(1,2,3)になります。 例2) ::Math.Ave(vData[0, ])は0列目の平均値、つまり2になります。 例3) vData [c(1,2), ]は0列目と2列目、つまり下記になります。
    c( c(“Test1”,”Test2”,”Test3”),
       c(T,F,T) );
例4) vData [c(2,1), ]は2列目と1列目、つまり下記になります。
    c( c(T,F,T),
       c(“Test1”,”Test2”,”Test3”) );
例5) vData [c(1,1) , ]は1列目と1列目、つまり下記になります。
    c( c(T,F,T),
       c(“Test1”,”Test2”,”Test3”) );
例6) vData [ , vData [3, ] > #2005/1/1 14:00:00#]は「2005/1/1 14:00:00」以降のレコードを取得します。
    c( c(T,F,T),
       c(T,F,T) );
例7) ::Math.Ave(vData [0 , vData [3, ] > #2005/1/1 14:00:00#])は、「2005/1/1 14:00:00」以降のレコードを取得し、平均値を求めます。つまりc(2,3)の平均値、2.5になります。
    c( c(2,3),
       c(”Test2”,”Test3”),
       c(F,T),
       c(”#2005/1/1 14:25:00#”,”#2005/1/1 15:15:00#”) );
| ::Mathメソッドはテーブルのデータを集計するのに便利です。例えば下記は各フィールドの平均値や合計、最大値などを求めます。 ::Mathメソッドについては本マニュアルのルートメソッドを参照下さい。 var a = ::Math.Ave(vData); //平均値 var a = ::Math.Sum(vData); //合計値 var a = ::Math.Max(vData); //最大値 var a = ::Math.Min(vData); //最小値