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;
  };
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int db;
   string filename="company.sqlite";
//--- 열기
   db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("DB: "filename" 코드와 함께 열기 실패 "GetLastError());
      return;
     }
//--- 테이블 COMPANY가 존재하면 테이블을 놓습니다
   if(DatabaseTableExists(db"COMPANY"))
     {
      //--- 테이블 삭제
      if(!DatabaseExecute(db"DROP TABLE COMPANY"))
        {
         Print("코드가 있는 테이블 COMPANY 삭제 실패 "GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- 테이블 생성
   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" 코드로 테이블 생성 실패 "GetLastError());
      DatabaseClose(db);
      return;
     }
 
//--- 데이터 삽입
   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" 코드로 삽입하는데 실패 "GetLastError());
      DatabaseClose(db);
      return;
     }
 
//--- 요청 준비
   int request=DatabasePrepare(db"SELECT * FROM COMPANY WHERE SALARY>15000");
   if(request==INVALID_HANDLE)
     {
      Print("DB: "filename" 코드를 이용한 요청 실패 "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- 기록 인쇄
   Person person;
   Print("급여 인원 > 15000:");
   for(int i=0DatabaseReadBind(requestperson); i++)
      Print(i":  "person.id" "person.name" "person.age" "person.address" "person.salary);
//--- 사용 후 요청 삭제
   DatabaseFinalize(request);
 
   Print("일부 통계:");
//--- 총 급여에 대한 새로운 요구를 준비
   request=DatabasePrepare(db"SELECT SUM(SALARY) FROM COMPANY");
   if(request==INVALID_HANDLE)
     {
      Print("DB: "filename" 코드를 이용한 요청 실패 "GetLastError());
      DatabaseClose(db);
      return;
     }
   while(DatabaseRead(request))
     {
      double total_salary;
      DatabaseColumnDouble(request0total_salary);
      Print("총 급여="total_salary);
     }
//--- 사용 후 요청 삭제
   DatabaseFinalize(request);
 
//--- 평균 급여에 대한 새로운 요구를 준비
   request=DatabasePrepare(db"SELECT AVG(SALARY) FROM COMPANY");
   if(request==INVALID_HANDLE)
     {
      Print("DB: "filename" 코드를 이용한 요청 실패 "GetLastError());
      ResetLastError();
      DatabaseClose(db);
      return;
     }
   while(DatabaseRead(request))
     {
      double aver_salary;
      DatabaseColumnDouble(request0aver_salary);
      Print("평균 급여="aver_salary);
     }
//--- 사용 후 요청 삭제
   DatabaseFinalize(request);
 
//--- 데이터베이스 닫기
   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
*/

추가 참조

DatabasePrepare, DatabaseRead