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)    – 不存在表格(没有错误,正常完成)。

注意

struct_object结构中的字段数不应超过DatabaseColumnsCount()。如果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