DatabaseBindArray

パラメータ値として配列を設定します。

bool  DatabaseBind(
  int request,     // DatabasePrepareで作成されたリクエストのハンドル
  int index,       // リクエストのパラメータインデックス
  T&   array[]       // 配列としてのパラメータ値
  );

パラメータ

request

[in] DatabasePrepare()で作成されたリクエストのハンドル。

index

[in] 値を設定する必要があるリクエストのパラメータインデックス(0から始まる)。

array[]

[in] リクエストパラメータ値として設定される配列

戻り値

成功の場合は true、それ以外の場合は false。エラーコードを受け取るには GetLastError() 関数を使用します。以下の応答が可能です。

  • ERR_INVALID_PARAMETER (4003)              – サポートされていないタイプ
  • ERR_ARRAY_BAD_SIZE (4011)                    - 配列サイズ(バイト単位)がINT_MAXを超える
  • ERR_DATABASE_INVALID_HANDLE (5121)  - 無効なデータベースハンドル
  • ERR_DATABASE_NOT_READY (5128)    - 現在、この関数を使用してリクエストを行うことはできない(リクエストが実行されているかすでに完了しているため、DatabaseResetを呼び出す必要がある)

注意事項

この関数は、SQL要求に「?」または「?N」パラメータ化可能値が含まれている場合に使用されます 。ここで、Nはパラメータインデックス(1から始まる)を意味します。同時に、DatabaseBindArray()のパラメータインデックスはゼロから開始します。

例は下記の通りです。

    INSERT INTO table VALUES (?,?,?)

この関数は、パラメータ化されたリクエストがDatabasePrepare()で作成された直後、またはリクエストがDatabaseReset()を使用してリセットされた直後に呼び出すことができます。

この関数をDatabaseReset()と一緒に使用して、異なるパラメータ値で必要な回数だけリクエストを実行します。

例:

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- DAT拡張子を持つファイルを選択するためのダイアログを開く
  string selected_files[];
  if(!FileSelectDialog("Select files to download", NULL,
                      "Data files (*.dat)|*.dat|All files (*.*)|*.*",
                      FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
    {
    Print("Files not selected. Exit");
    return;
    }
//--- ファイルのサイズを取得する
  ulong filesize[];
  int filehandle[];
  int files=ArraySize(selected_files);
  ArrayResize(filesize, files);
  ZeroMemory(filesize);
  ArrayResize(filehandle, files);
  double total_size=0;
  for(int i=0; i<files; i++)
    {
     filehandle[i]=FileOpen(selected_files[i], FILE_READ|FILE_BIN);
    if(filehandle[i]!=INVALID_HANDLE)
       {
        filesize[i]=FileSize(filehandle[i]);
        //PrintFormat("%d, %s handle=%d %d bytes", i, selected_files[i], filehandle[i], filesize[i]);
        total_size+=(double)filesize[i];
       }
    }
//--- ファイルの一般的なサイズを確認する
  if(total_size==0)
    {
    PrintFormat("Total files size is 0. Exit");
    return;
    }
 
//--- 共通の端末フォルダーでデータベースを作成または開きます
  string filename="dat_files.sqlite";
  int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
  if(db==INVALID_HANDLE)
    {
    Print("DB: ", filename, " open failed with code ", GetLastError());
    return;
    }
  else
    Print("Database: ", filename, " opened successfully");
//--- FILESテーブルが存在する場合は削除する
  if(DatabaseTableExists(db, "FILES"))
    {
    //--- delete the table
    if(!DatabaseExecute(db, "DROP TABLE FILES"))
       {
        Print("Failed to drop table FILES with code ", GetLastError());
        DatabaseClose(db);
        return;
       }
    }
//--- FILESテーブルを作成する
  if(!DatabaseExecute(db, "CREATE TABLE FILES("
                      "NAME           TEXT NOT NULL,"
                      "SIZE           INT  NOT NULL,"
                      "PERCENT_SIZE   REAL NOT NULL,"
                      "DATA           BLOB NOT NULL);"))
    {
    Print("DB: failed to create table FILES with code ", GetLastError());
    DatabaseClose(db);
    return;
    }
//--- FILESテーブルのすべてのフィールドのリストを表示する
  if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)
    {
    PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") failed, error code=%d at line %d", GetLastError(), __LINE__);
    DatabaseClose(db);
    return;
    }
 
//--- FILESテーブルにファイルを追加するためにパラメータ化されたリクエストを作成する
  string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
            " VALUES (?1,?2,?3,?4);"; // リクエストパラメータ
  int request=DatabasePrepare(db, sql);
  if(request==INVALID_HANDLE)
    {
    PrintFormat("DatabasePrepare() failed with code=%d", GetLastError());
    Print("SQL request: ", sql);
    DatabaseClose(db);
    return;
    }
 
//--- すべてのファイルを1つずつ、FILESテーブルに追加する
  bool request_error=false;
  DatabaseTransactionBegin(db);
  int count=0;
  uint size;
  for(int i=0; i<files; i++)
    {
    if(filehandle[i]!=INVALID_HANDLE)
       {
        char data[];
        size=FileReadArray(filehandle[i], data);
        if(size==0)
          {
          PrintFormat("FileReadArray(%s) failed with code %d", selected_files[i], GetLastError());
          continue;
          }
 
        count++;
        //--- ファイルをテーブルに追加する前にパラメータの値を設定する
        if(!DatabaseBind(request, 0, selected_files[i]))
          {
          PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
           request_error=true;
          break;
          }
        if(!DatabaseBind(request, 1, size))
          {
          PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
           request_error=true;
          break;
          }
        if(!DatabaseBind(request, 2, double(size)*100./total_size))
          {
          PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
           request_error=true;
          break;
          }
        if(!DatabaseBindArray(request, 3, data))
          {
          PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
           request_error=true;
          break;
          }
        //--- エントリを挿入するリクエストを実行し、エラーを確認する
        if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
          {
          PrintFormat("DatabaseRead() failed with code=%d", GetLastError());
          DatabaseFinalize(request);
           request_error=true;
          break;
          }
        else
          PrintFormat("%d. %s: %d bytes", count, selected_files[i],size);
        //--- 次のパラメータ更新の前にリクエストをリセットする
        if(!DatabaseReset(request))
          {
          PrintFormat("DatabaseReset() failed with code=%d", GetLastError());
          DatabaseFinalize(request);
           request_error=true;
          break;
          }
       }
    }
//--- トランザクション状態
  if(request_error)
    {
    PrintFormat("Table FILES: failed to add %d files", count);
    DatabaseTransactionRollback(db);
    DatabaseClose(db);
    return;
    }
  else
    {
    DatabaseTransactionCommit(db);
    PrintFormat("Table FILES: added %d files", count);
    }
 
//--- データベースファイルを閉じて、その件を通知する
  DatabaseClose(db);
  PrintFormat("Database: %s created and closed", filename);
 }

参照

DatabasePrepareDatabaseResetDatabaseReadDatabaseBind