创建、打开和关闭数据库

DatabaseOpenDatabaseClose 函数能够创建和打开数据库。

int DatabaseOpen(const string filename, uint flags)

该函数在名为 filename 的文件中打开或创建数据库。该参数不仅可以包含名称,还可以包含相对于 MQL5/Files(特定终端实例的或共享文件夹中,见下文标志)的子文件夹路径。可以省略扩展名,这会为默认名称添加 ".sqlite"。

如果在 filename 参数中指定 NULL 或空字符串 "",则数据库在临时文件中创建,该文件将在数据库关闭后自动删除。

如果在 filename 参数中指定 ":memory:" 字符串,则数据库将在内存中创建。这样的临时数据库将在关闭后自动删除。

flags 参数包含一个标志组合,这些标志描述了从 ENUM_DATABASE_OPEN_FLAGS 枚举创建或打开数据库的附加条件。

标识符

说明

DATABASE_OPEN_READONLY

只读打开

DATABASE_OPEN_READWRITE

读写打开

DATABASE_OPEN_CREATE

如果磁盘上不存在文件,则创建一个

DATABASE_OPEN_MEMORY

创建内存数据库

DATABASE_OPEN_COMMON

文件位于所有终端的共享文件夹中

如果在 flags 参数中未指定 DATABASE_OPEN_READONLY 或 DATABASE_OPEN_READWRITE 标志,则将使用 DATABASE_OPEN_READWRITE 标志。

成功时,函数返回数据库的句柄,该句柄随后用作一个参数,以供其他函数访问该数据库。否则,返回 INVALID_HANDLE,并且可以在 _LastError 中找到错误代码。

void DatabaseClose(int database)

DatabaseClose 函数通过其句柄关闭数据库,该句柄是先前从 DatabaseOpen 函数接收的。

调用 DatabaseClose 后,我们将在以下章节中学习为打开的数据库创建的所有查询句柄都将自动移除并失效。

该函数不返回任何内容。但是,如果向其传递了不正确的句柄,它会将 _LastError 设置为 ERR_DATABASE_INVALID_HANDLE。

我们在 DBSQLite.mqh 文件中开始开发数据库的面向对象包装器。

DBSQlite 类将确保数据库的创建、打开和关闭。我们稍后会对其进行扩展。

class DBSQLite
{
protected:
   const string path;
   const int handle;
   const uint flags;
   
public:
   DBSQLite(const string fileconst uint opts =
      DATABASE_OPEN_CREATE | DATABASE_OPEN_READWRITE):
      path(file), flags(opts), handle(DatabaseOpen(fileopts))
   {
   }
   
   ~DBSQLite(void)
   {
      if(handle != INVALID_HANDLE)
      {
         DatabaseClose(handle);
      }
   }
   
   int getHandle() const
   {
      return handle;
   }
   
   bool isOpen() const
   {
      return handle != INVALID_HANDLE;
   }
};

请注意,数据库在创建对象时自动创建或打开,并在销毁对象时关闭。

使用这个类,我们编写一个简单的脚本 DBinit.mq5,它将创建或打开指定的数据库。

input string Database = "MQL5Book/DB/Example1";
   
void OnStart()
{
   DBSQLite db(Database);                   // create or open the base in the constructor
   PRTF(db.getHandle());                    // 65537 / ok
   PRTF(FileIsExist(Database + ".sqlite")); // true / ok
// the base is closed in the destructor

以默认设置首次运行后,我们应该得到一个新文件 MQL5/Files/MQL5Book/DB/Example1.sqlite。要确认这一点,只需在代码中检查该文件是否存在。在后续以相同名称运行时,脚本只是打开数据库并记录当前的描述符(一个整数)。