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(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"))

     {

      //--- 删除表格

      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"))

     {

      //--- 删除表格

      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