Kiểm tra sự tồn tại của bảng trong cơ sở dữ liệu
Hàm tích hợp sẵn DatabaseTableExists
cho phép bạn kiểm tra sự tồn tại của một bảng theo tên của nó.
bool DatabaseTableExists(int database, const string table)
Mô tả cơ sở dữ liệu và tên bảng được chỉ định trong các tham số. Kết quả của lời gọi hàm là true
nếu bảng tồn tại.
Hãy mở rộng lớp DBSQLite
bằng cách thêm phương thức hasTable
.
class DBSQLite
{
...
bool hasTable(const string table) const
{
return DatabaseTableExists(handle, table);
}
};
2
3
4
5
6
7
8
Script DBcreateTable.mq5
sẽ kiểm tra xem bảng đã xuất hiện chưa.
void OnStart()
{
DBSQLite db(Database);
if(db.isOpen())
{
PRTF(db.execute(StringFormat("CREATE TABLE %s (msg text)", Table)));
PRTF(db.hasTable(Table));
}
}
2
3
4
5
6
7
8
9
Đừng lo lắng về việc có thể nhận được lỗi khi cố gắng tạo lại. Điều này không ảnh hưởng đến sự tồn tại của bảng theo bất kỳ cách nào.
database error, table table1 already exists
db.execute(StringFormat(CREATE TABLE %s (msg text),Table))=false / DATABASE_ERROR(5601)
db.hasTable(Table)=true / ok
2
3
Vì chúng ta đang viết một lớp trợ giúp chung DBSQLite
, chúng ta sẽ cung cấp một cơ chế để xóa bảng trong đó. SQL có lệnh DROP cho mục đích này.
class DBSQLite
{
...
bool deleteTable(const string name) const
{
const static string query = "DROP TABLE '%s';";
if(!DatabaseTableExists(handle, name)) return true;
if(!DatabaseExecute(handle, StringFormat(query, name))) return false;
return !DatabaseTableExists(handle, name)
&& ResetLastErrorOnCondition(_LastError == DATABASE_NO_MORE_DATA);
}
static bool ResetLastErrorOnCondition(const bool cond)
{
if(cond)
{
ResetLastError();
return true;
}
return false;
}
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Trước khi thực thi truy vấn, chúng ta kiểm tra sự tồn tại của bảng và thoát ngay lập tức nếu nó không tồn tại.
Sau khi thực thi truy vấn, chúng ta kiểm tra thêm xem bảng đã bị xóa chưa bằng cách gọi lại DatabaseTableExists
. Vì sự vắng mặt của bảng sẽ được đánh dấu bằng mã lỗi DATABASE_NO_MORE_DATA, đây là kết quả mong đợi cho phương thức này, chúng ta xóa mã lỗi bằng ResetLastErrorOnCondition
.
Có thể hiệu quả hơn khi sử dụng khả năng của SQL để loại bỏ việc cố gắng xóa một bảng không tồn tại: chỉ cần thêm cụm từ "IF EXISTS" vào truy vấn. Do đó, phiên bản cuối cùng của phương thức deleteTable
được đơn giản hóa:
bool deleteTable(const string name) const
{
const static string query = "DROP TABLE IF EXISTS '%s';";
return DatabaseExecute(handle, StringFormat(query, name));
}
2
3
4
5
Bạn có thể thử viết một script kiểm tra để xóa bảng, nhưng hãy cẩn thận để không vô tình xóa một bảng đang hoạt động. Các bảng bị xóa ngay lập tức cùng với tất cả dữ liệu, không cần xác nhận và không có khả năng khôi phục. Đối với các dự án quan trọng, hãy giữ bản sao lưu cơ sở dữ liệu.