Tạo, mở và đóng cơ sở dữ liệu
Các hàm DatabaseOpen
và DatabaseClose
cho phép tạo và mở cơ sở dữ liệu.
int DatabaseOpen(const string filename, uint flags)
Hàm này mở hoặc tạo một cơ sở dữ liệu trong một tệp có tên filename
. Tham số có thể chứa không chỉ tên mà còn đường dẫn với các thư mục con tương ứng với MQL5/Files
(của một phiên bản terminal cụ thể hoặc trong thư mục dùng chung, xem các cờ dưới đây). Phần mở rộng có thể được bỏ qua, điều này sẽ thêm ".sqlite" vào tên mặc định.
Nếu NULL hoặc chuỗi rỗng "" được chỉ định trong tham số filename
, thì cơ sở dữ liệu được tạo trong một tệp tạm thời, sẽ tự động bị xóa sau khi cơ sở dữ liệu được đóng.
Nếu chuỗi ":memory:" được chỉ định trong tham số filename
, cơ sở dữ liệu sẽ được tạo trong bộ nhớ. Một cơ sở tạm thời như vậy sẽ tự động bị xóa sau khi đóng.
Tham số flags
chứa một tổ hợp các cờ mô tả các điều kiện bổ sung để tạo hoặc mở cơ sở dữ liệu từ liệt kê ENUM_DATABASE_OPEN_FLAGS.
Định danh | Mô tả |
---|---|
DATABASE_OPEN_READONLY | Chỉ mở để đọc |
DATABASE_OPEN_READWRITE | Mở để đọc và ghi |
DATABASE_OPEN_CREATE | Tạo tệp trên đĩa nếu nó chưa tồn tại |
DATABASE_OPEN_MEMORY | Tạo cơ sở dữ liệu trong bộ nhớ |
DATABASE_OPEN_COMMON | Tệp nằm trong thư mục dùng chung của tất cả các terminal |
Nếu không có cờ nào trong số DATABASE_OPEN_READONLY hoặc DATABASE_OPEN_READWRITE được chỉ định trong tham số flags
, cờ DATABASE_OPEN_READWRITE sẽ được sử dụng.
Khi thành công, hàm trả về một handle cho cơ sở dữ liệu, sau đó được sử dụng làm tham số cho các hàm khác để truy cập nó. Ngược lại, INVALID_HANDLE được trả về, và mã lỗi có thể được tìm thấy trong _LastError
.
void DatabaseClose(int database)
Hàm DatabaseClose
đóng cơ sở dữ liệu bằng handle của nó, handle này trước đó đã được nhận từ hàm DatabaseOpen
.
Sau khi gọi DatabaseClose
, tất cả các handle truy vấn mà chúng ta sẽ học cách tạo cho một cơ sở mở trong các phần tiếp theo sẽ tự động bị xóa và vô hiệu hóa.
Hàm không trả về gì. Tuy nhiên, nếu một handle không chính xác được truyền vào nó, nó sẽ đặt _LastError
thành ERR_DATABASE_INVALID_HANDLE.
Hãy bắt đầu phát triển một lớp bao bọc hướng đối tượng cho cơ sở dữ liệu trong tệp DBSQLite.mqh
.
Lớp DBSQLite
sẽ đảm bảo việc tạo, mở và đóng cơ sở dữ liệu. Chúng ta sẽ mở rộng nó sau này.
class DBSQLite
{
protected:
const string path;
const int handle;
const uint flags;
public:
DBSQLite(const string file, const uint opts =
DATABASE_OPEN_CREATE | DATABASE_OPEN_READWRITE):
path(file), flags(opts), handle(DatabaseOpen(file, opts))
{
}
~DBSQLite(void)
{
if(handle != INVALID_HANDLE)
{
DatabaseClose(handle);
}
}
int getHandle() const
{
return handle;
}
bool isOpen() const
{
return handle != INVALID_HANDLE;
}
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Lưu ý rằng cơ sở dữ liệu được tự động tạo hoặc mở khi đối tượng được tạo, và đóng khi đối tượng bị hủy.
Sử dụng lớp này, hãy viết một script đơn giản DBinit.mq5
, script này sẽ tạo hoặc mở cơ sở dữ liệu được chỉ định.
input string Database = "MQL5Book/DB/Example1";
void OnStart()
{
DBSQLite db(Database); // tạo hoặc mở cơ sở trong hàm tạo
PRTF(db.getHandle()); // 65537 / ok
PRTF(FileIsExist(Database + ".sqlite")); // true / ok
} // cơ sở được đóng trong hàm hủy
2
3
4
5
6
7
8
Sau lần chạy đầu tiên, với cài đặt mặc định, chúng ta sẽ nhận được một tệp mới MQL5/Files/MQL5Book/DB/Example1.sqlite
. Điều này được xác nhận trong mã bằng cách kiểm tra sự tồn tại của tệp. Trong các lần chạy tiếp theo với cùng tên, script chỉ đơn giản là mở cơ sở dữ liệu và ghi lại mô tả hiện tại (một số nguyên).