DatabasePrint

엑스퍼트 저널에 테이블 또는 SQL 요청 실행 결과를 인쇄.

long  DatabasePrint(
   int           database,          // DatabaseOpen에서 수신된 데이터베이스 핸들
   const string  table_or_sql,      // 테이블 또는 SQL 요청
   uint          flags              // 플래그의 조합
   );

매개변수

database

[in] DatabaseOpen()로 수신된 데이터베이스 핸들.

table_or_sql

[in]  엑스퍼트 저널에 결과가 표시되는 SQL 요청 텍스트 또는 테이블 이름.

flags

[in]  출력 형식을 정의하는 플래그 조합. 플래그는 다음과 같이 정의됩니다:

DATABASE_PRINT_NO_HEADER      – 테이블 열 이름(필드이름) 표시 안함
DATABASE_PRINT_NO_INDEX         – 문자열 인덱스 표시 안 함
DATABASE_PRINT_NO_FRAME        – 헤더와 데이터를 구분하여 프레임을 표시하지 않음
DATABASE_PRINT_STRINGS_RIGHT – 문자열을 우측으로 정렬

flags=0이면 열과 문자열이 표시되고, 헤더와 데이터는 프레임으로 구분되며, 문자열은 좌측에 정렬됩니다.

반환 값

내보낸 문자열 수를 반환하거나 오류 발생 시 -1을 반환. 오류 코드를 가져오려면 GetLastError()를 사용해야 하며, 가능한 응답은 다음과 같습니다:

  • ERR_INTERNAL_ERROR (4001)                       – 심각한 런타임 오류;
  • ERR_NOT_ENOUGH_MEMORY (4004)              - 충분하지 않은 메모리;
  • ERR_DATABASE_INTERNAL (5120)                 – 내부 데이터베이스 오류;
  • ERR_DATABASE_INVALID_HANDLE (5121)      - 유효하지 않은 데이터베이스 핸들;  

참고

저널 요청 결과가 표시되면 SQL 요청은 "SELECT" 또는 "select"로 시작해야 합니다. 즉, SQL 요청에서 데이터베이스 상태를 변경할 수 없으며, 그렇지 않으면 DatabasePrint()가 실패하고 오류가 발생합니다.

예:

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string filename="departments.sqlite";
//--- 공통 터미널 폴더에서 데이터베이스 생성 또는 열기
   int db=DatabaseOpen(filenameDATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("DB: "filename" 코드와 함께 열기 실패 "GetLastError());
      return;
     }
 
//--- COMPANY 테이블을 생성
   if(!CreataTableCompany(db))
     {
      DatabaseClose(db);
      return;
     }
//--- DEPARTMENT 테이블을 생성
   if(!CreataTableDepartment(db))
     {
      DatabaseClose(db);
      return;
     }
 
//--- COMPANY 및 DEPARTMENT 테이블에 모든 필드 목록을 표시
   PrintFormat("요청 인쇄 시도 \"PRAGMA TABLE_INFO(COMPANY);PRAGMA TABLE_INFO(DEPARTMENT)\"");
   if(DatabasePrint(db"PRAGMA TABLE_INFO(COMPANY);PRAGMA TABLE_INFO(DEPARTMENT)"0)<0)
     {
      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO()\") failed, error code=%d"GetLastError());
      DatabaseClose(db);
      return;
     }
//--- 로그에 COMPANY 테이블을 표시
   PrintFormat("요청 인쇄 시도 \"SELECT * from COMPANY\"");
   if(DatabasePrint(db"SELECT * from COMPANY"0)<0)
     {
      Print("DatabasePrint failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- COMPANY 및 DEPARTMENT 테이블을 결합하기 위한 요청 텍스트
   string request="SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT "
                  "ON COMPANY.ID = DEPARTMENT.EMP_ID";
//--- 테이블 조합 결과를 표시
   PrintFormat("요청 인쇄 시도 \"SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT\"");
   if(DatabasePrint(dbrequest0)<0)
     {
      Print("DatabasePrint failed with code "GetLastError());
      DatabaseClose(db);
      return;
     }
//--- 데이터베이스 닫기
   DatabaseClose(db);
  }
/*
결과:
Try to print request "PRAGMA TABLE_INFO(COMPANY);PRAGMA TABLE_INFO(DEPARTMENT)"
#cid name    type     notnull dflt_value pk
-+-------------------------------------------
1|   0 ID      INT            1             1 
2|   1 NAME    TEXT           1             0 
3|   2 AGE     INT            1             0 
4|   3 ADDRESS CHAR(50)       0             0 
5|   4 SALARY  REAL           0             0 
#cid name   type     notnull dflt_value pk
-+------------------------------------------
1|   0 ID     INT            1             1 
2|   1 DEPT   CHAR(50)       1             0 
3|   2 EMP_ID INT            1             0 
Try to print request "SELECT * from COMPANY"
#ID NAME  AGE ADDRESS     SALARY
-+--------------------------------
1|  1 Paul   32 California 25000.0 
2|  2 Allen  25 Texas      15000.0 
3|  3 Teddy  23 Norway     20000.0 
4|  4 Mark   25 Rich-Mond  65000.0 
5|  5 David  27 Texas      85000.0 
6|  6 Kim    22 South-Hall 45000.0 
7|  7 James  24 Houston    10000.0 
Try to print request "SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT"
#EMP_ID NAME  DEPT       
-+-------------------------
1|      1 Paul  IT Billing  
2|      2 Allen Engineering 
3|        Teddy             
4|        Mark              
5|        David             
6|        Kim               
7|      7 James Finance     
*/
//+------------------------------------------------------------------+
//| COMPANY 테이블 생성                           |
//+------------------------------------------------------------------+
bool CreateTableCompany(int database)
  {
//--- COMPANY 테이블이 있는 경우 삭제
   if(DatabaseTableExists(database"COMPANY"))
     {
      //--- 테이블 삭제
      if(!DatabaseExecute(database"DROP TABLE COMPANY"))
        {
         Print("코드가 있는 테이블 COMPANY 삭제 실패 "GetLastError());
         return(false);
        }
     }
//--- COMPANY 테이블을 생성
   if(!DatabaseExecute(database"CREATE TABLE COMPANY("
                       "ID INT PRIMARY KEY     NOT NULL,"
                       "NAME           TEXT    NOT NULL,"
                       "AGE            INT     NOT NULL,"
                       "ADDRESS        CHAR(50),"
                       "SALARY         REAL );"))
     {
      Print("DB: 코드가 있는 테이블 COMPANY 삭제 실패 "GetLastError());
      return(false);
     }
 
//--- COMPANY 테이블에 데이터 입력
   if(!DatabaseExecute(database"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); "
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (5, 'David', 27, 'Texas', 85000.0); "
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (6, 'Kim', 22, 'South-Hall', 45000.0); "
                       "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, 'James', 24, 'Houston', 10000.00); "))
     {
      Print("코드로 COMPANY 삽입 실패 "GetLastError());
      return(false);
     }
//--- 성공
   return(true);
  }
//+------------------------------------------------------------------+
//| DEPARTMENT 테이블 생성                       |
//+------------------------------------------------------------------+
bool CreateTableDepartment(int database)
  {
//--- DEPARTMENT 테이블이 있는 경우 삭제
   if(DatabaseTableExists(database"DEPARTMENT"))
     {
      //--- 테이블 삭제
      if(!DatabaseExecute(database"DROP TABLE DEPARTMENT"))
        {
         Print("코드로 테이블 DEPARTMENT를 삭제 실패 "GetLastError());
         return(false);
        }
     }
//--- DEPARTMENT 테이블을 생성
   if(!DatabaseExecute(database"CREATE TABLE DEPARTMENT ("
                       "ID      INT PRIMARY KEY   NOT NULL,"
                       "DEPT    CHAR(50)          NOT NULL,"
                       "EMP_ID  INT               NOT NULL);"))
     {
      Print("DB: 코드로 테이블 DEPARTMENT 생성 실패 "GetLastError());
      return(false);
     }
 
//--- DEPARTMENT 테이블에 데이터를 입력
   if(!DatabaseExecute(database"INSERT INTO DEPARTMENT (ID,DEPT,EMP_ID) VALUES (1, 'IT Billing', 1); "
                       "INSERT INTO DEPARTMENT (ID,DEPT,EMP_ID) VALUES (2, 'Engineering', 2); "
                       "INSERT INTO DEPARTMENT (ID,DEPT,EMP_ID) VALUES (3, 'Finance', 7);"))
     {
      Print("코드로 DEPARTMENT 삽입 실패 "GetLastError());
      return(false);
     }
//--- 성공
   return(true);
  }
//+-------------------------------------------------------------------

추가 참조

DatabaseExport, DatabaseImport