DatabasePrint

テーブルまたはSQL要求の実行結果をエクスパート操作ログに出力します。

long DatabasePrint(
  int           database,         // DatabaseOpenで受信したデータベースハンドル
  const string table_or_sql,     // テーブルまたはSQL要求
  uint         flags             // フラグの組み合わせ
  );

パラメータ

database

[in] DatabaseOpen()で受信したデータベースハンドル。

table_or_sql

[in] 結果がエキスパート操作ログに表示されるテーブルの名前またはSQL要求のテキスト。

フラグ

[in] 出力形式を設定するフラグの組み合わせ。フラグは下記の様に定義されます。

DATABASE_PRINT_NO_HEADER – テーブルの列名(フィールド名)を表示しない
DATABASE_PRINT_NO_INDEX – 文字列インデックスを表示しない
DATABASE_PRINT_NO_FRAME do– ヘッダーとデータを分離するフレームを表示しない
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(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
  if(db==INVALID_HANDLE)
    {
    Print("DB: ", filename, " open failed with code ", GetLastError());
    return;
    }
 
//--- COMPANYテーブルを作成する
  if(!CreataTableCompany(db))
    {
    DatabaseClose(db);
    return;
    }
//--- DEPARTMENTテーブルを作成する
  if(!CreataTableDepartment(db))
    {
    DatabaseClose(db);
    return;
    }
 
//--- COMPANYおよびDEPARTMENTテーブルのすべてのフィールドのリストを表示する
  PrintFormat("Try to print request \"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("Try to print request \"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("Try to print request \"SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT\"");
  if(DatabasePrint(db, request, 0)<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"))
    {
    //--- delete the table
    if(!DatabaseExecute(database, "DROP TABLE COMPANY"))
       {
        Print("Failed to drop table COMPANY with code ", 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: create table COMPANY failed with code ", 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 insert failed with code ", GetLastError());
    return(false);
    }
//--- 成功
  return(true);
 }
//+------------------------------------------------------------------+
//| DEPARTMENTテーブルを作成する                                          |
//+------------------------------------------------------------------+
bool CreateTableDepartment(int database)
 {
//--- DEPARTMENTテーブルが存在する場合は削除する
  if(DatabaseTableExists(database, "DEPARTMENT"))
    {
    //--- delete the table
    if(!DatabaseExecute(database, "DROP TABLE DEPARTMENT"))
       {
        Print("Failed to drop table DEPARTMENT  with code ", 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: create table DEPARTMENT failed with code ", 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 insert failed with code ", GetLastError());
    return(false);
    }
//--- 成功
  return(true);
 }
//+-------------------------------------------------------------------

参照

DatabaseExportDatabaseImport