DatabaseReadBind

次のレコードに移動し、そこから構造体にデータを読み込みます。

bool  DatabaseReadBind(
  int   request,           // DatabasePrepareで作成されたリクエストのハンドル
  void& struct_object     // レコードを読み取るための構造体への参照
  );

パラメータ

request

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

struct_object

[out] 現在のレコードのデータが読み取られる構造体への参照。構造体は、メンバーとして数値型および/または文字列(配列は許可されません)のみを持つ必要があり、子孫にはできません。

戻り値

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

  • ERR_INVALID_PARAMETER (4003)               –  テーブル名が指定されていない(空の文字列またはNULL)
  • ERR_WRONG_STRING_PARAMETER (5040)  – 要求をUTF-8文字列に変換する際のエラー
  • ERR_DATABASE_INTERNAL (5120)              – 内部データベースエラー
  • ERR_DATABASE_INVALID_HANDLE (5121)    – 無効なデータベースハンドル
  • ERR_DATABASE_EXECUTE (5124)                –  リクエスト実行エラー
  • ERR_DATABASE_NO_MORE_DATA (5126)    – テーブルが存在しない(エラーではなく、正常に完了する)

 

注意事項

record構造体のフィールド数はDatabaseColumnsCount()を越えられません。struct_object構造体のフィールド数がstruct_object構造体のフィールド数未満の場合、読み込みは部分的になります。残りのデータは、対応するDatabaseColumnText()DatabaseColumnInteger()およびその他の関数を使用して明示的に取得できます。

例:

struct Person
 {
  int               id;
  string           name;
  int               age;
  string           address;
  double           salary;
 };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  int db;
  string filename="company.sqlite";
//--- open
  db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
  if(db==INVALID_HANDLE)
    {
    Print("DB: ", filename, " open failed with code ", GetLastError());
    return;
    }
//--- if the table COMPANY exists then drop the table
  if(DatabaseTableExists(db, "COMPANY"))
    {
    //--- delete the table
    if(!DatabaseExecute(db, "DROP TABLE COMPANY"))
       {
        Print("Failed to drop table COMPANY with code ", GetLastError());
        DatabaseClose(db);
        return;
       }
    }
//--- create table
  if(!DatabaseExecute(db, "CREATE TABLE COMPANY("
                      "ID INT PRIMARY KEY     NOT NULL,"
                      "NAME           TEXT    NOT NULL,"
                      "AGE            INT     NOT NULL,"
                      "ADDRESS        CHAR(50),"
                      "SALARY         REAL );"))
    {
    Print("DB: ", filename, " create table failed with code ", GetLastError());
    DatabaseClose(db);
    return;
    }
 
//--- insert data
  if(!DatabaseExecute(db, "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 25000.00 ); "
                      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "
                      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"
                      "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"))
    {
    Print("DB: ", filename, " insert failed with code ", GetLastError());
    DatabaseClose(db);
    return;
    }
 
//--- prepare the request
  int request=DatabasePrepare(db, "SELECT * FROM COMPANY WHERE SALARY>15000");
  if(request==INVALID_HANDLE)
    {
    Print("DB: ", filename, " request failed with code ", GetLastError());
    DatabaseClose(db);
    return;
    }
//--- print records
  Person person;
  Print("Persons with salary > 15000:");
  for(int i=0; DatabaseReadBind(request, person); i++)
    Print(i, ":  ", person.id, " ", person.name, " ", person.age, " ", person.address, " ", person.salary);
//--- delete request after use
  DatabaseFinalize(request);
 
  Print("Some statistics:");
//--- prepare new request about total salary
  request=DatabasePrepare(db, "SELECT SUM(SALARY) FROM COMPANY");
  if(request==INVALID_HANDLE)
    {
    Print("DB: ", filename, " request failed with code ", GetLastError());
    DatabaseClose(db);
    return;
    }
  while(DatabaseRead(request))
    {
    double total_salary;
    DatabaseColumnDouble(request, 0, total_salary);
    Print("Total salary=", total_salary);
    }
//--- delete request after use
  DatabaseFinalize(request);
 
//--- prepare new request about average salary
  request=DatabasePrepare(db, "SELECT AVG(SALARY) FROM COMPANY");
  if(request==INVALID_HANDLE)
    {
    Print("DB: ", filename, " request failed with code ", GetLastError());
    ResetLastError();
    DatabaseClose(db);
    return;
    }
  while(DatabaseRead(request))
    {
    double aver_salary;
    DatabaseColumnDouble(request, 0, aver_salary);
    Print("Average salary=", aver_salary);
    }
//--- delete request after use
  DatabaseFinalize(request);
 
//--- close database
  DatabaseClose(db);
 }
//+-------------------------------------------------------------------
/*
Output:
Persons with salary > 15000:
0: 1 Paul 32 California 25000.0
1: 3 Teddy 23 Norway 20000.0
2: 4 Mark 25 Rich-Mond 65000.0
Some statistics:
Total salary=125000.0
Average salary=31250.0
*/

参照

DatabasePrepareDatabaseRead