DatabaseReadBind

Wechselt zum nächsten Datensatz und liest aus ihm Daten in die Struktur.

bool  DatabaseReadBind(
   int    request,           // Handle der Anfrage, das durch DatabasePrepare erhalten wurde
   void&  struct_object      // die Referenz der Struktur, der das Ergebnis zugewiesen wird
   );

Parameter

request

[in]  Das Handle einer Anfrage, das in DatabasePrepare() erstellt wurde.

struct_object

[out]  Die Referenz auf die Struktur, der die Daten aus dem aktuellen Datensatz zugewiesen werden sollen. Die Struktur sollte nur numerische Typen und/oder Zeichenketten (Arrays sind nicht erlaubt) als Mitglieder haben und darf nicht abgeleitet worden sein.

Rückgabewert

Rückgabe, bei Erfolg, von true sonst false. Um die Fehlernummer zu erhalten, verwenden Sie GetLastError(), die möglichen Antworten sind:

  • ERR_INVALID_PARAMETER (4003)               –  Tabellenname wurde nicht angegeben (leer oder NULL);
  • ERR_WRONG_STRING_PARAMETER (5040)  – Fehler beim Konvertieren der Anfrage in eine UTF-8 Zeichenkette;
  • ERR_DATABASE_INTERNAL (5120)              – interner Datenbankfehler;
  • ERR_DATABASE_INVALID_HANDLE (5121)    – ungültiges Datenbankhandle;
  • ERR_DATABASE_EXECUTE (5124)                –  Fehler bei der Ausführung der Anfrage;
  • ERR_DATABASE_NO_MORE_DATA (5126)    – es existiert keine Tabelle (kein Fehler, normales Ende).

Hinweis

Anzahl der Felder in der Struktur struct_object sollte DatenbankColumnsCount() nicht überschreiten. Wenn die Anzahl der Felder in der Struktur struct_object kleiner ist als die Anzahl der Felder im Datensatz, werden nur Teile des Datensatzes zugewiesen. Die restlichen Daten können explizit über DatabaseColumnText(), DatabaseColumnInteger() und den anderen, geeigneten Funktionen abgerufen werden.

Beispiel:

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(filenameDATABASE_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=0DatabaseReadBind(requestperson); 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(request0total_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(request0aver_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
*/

Siehe auch

DatabasePrepare, DatabaseRead