Liên kết dữ liệu với các tham số truy vấn: DatabaseBind/Array
Sau khi truy vấn SQL được biên dịch bởi hàm DatabasePrepare
DatabasePrepare, bạn có thể sử dụng handle truy vấn nhận được để liên kết dữ liệu với các tham số truy vấn, đó là mục đích của các hàm DatabaseBind
và DatabaseBindArray
. Cả hai hàm này có thể được gọi không chỉ ngay sau khi tạo truy vấn trong DatabasePrepare
mà còn sau khi đặt lại yêu cầu về trạng thái ban đầu bằng DatabaseReset
DatabaseReset (nếu yêu cầu được thực thi nhiều lần trong một vòng lặp).
Bước liên kết dữ liệu không phải lúc nào cũng cần thiết vì các truy vấn đã chuẩn bị có thể không có tham số. Thông thường, tình huống này xảy ra khi một truy vấn trả về dữ liệu từ SQL sang MQL5, và do đó cần một mô tả truy vấn: cách đọc kết quả truy vấn theo handle của chúng được mô tả trong các phần về DatabaseRead/DatabaseReadBind
DatabaseRead/DatabaseReadBind và DatabaseColumn
DatabaseColumn-functions.
bool DatabaseBind(int request, int index, T value)
Hàm DatabaseBind
đặt giá trị của tham số index
cho truy vấn với handle request
. Theo mặc định, việc đánh số bắt đầu từ 0 nếu các tham số trong truy vấn được đánh dấu bằng ký hiệu thay thế '?' (không có số). Tuy nhiên, các tham số có thể được chỉ định trong chuỗi truy vấn kèm theo số (?1, '?5', ?21): trong trường hợp này, các chỉ số thực tế cần truyền vào hàm phải nhỏ hơn 1 so với số tương ứng trong chuỗi. Điều này là do việc đánh số trong chuỗi truy vấn bắt đầu từ 1.
Ví dụ, truy vấn sau yêu cầu một tham số (chỉ số 0):
int r = DatabasePrepare(db, "SELECT * FROM table WHERE id=?");
DatabaseBind(r, 0, 1234);
2
Nếu trong chuỗi truy vấn sử dụng thay thế "... id=?10", cần phải gọi DatabaseBind
với chỉ số 9.
value
trong nguyên mẫu DatabaseBind
có thể thuộc bất kỳ kiểu đơn giản hoặc chuỗi nào. Nếu một tham số cần ánh xạ dữ liệu kiểu phức hợp (cấu trúc) hoặc dữ liệu nhị phân tùy ý có thể được biểu diễn dưới dạng mảng byte, hãy sử dụng hàm DatabaseBindArray
.
Hàm trả về true
nếu thành công. Nếu không, nó trả về false
.
bool DatabaseBindArray(int request, int index, T &array[])
Hàm DatabaseBindArray
đặt giá trị của tham số index
dưới dạng một mảng của kiểu đơn giản hoặc của các cấu trúc đơn giản (bao gồm chuỗi) cho truy vấn với handle request
. Hàm này cho phép bạn ghi BLOB và NULL (sự vắng mặt của giá trị được coi là một kiểu riêng trong SQL và không bằng 0) vào cơ sở dữ liệu.
Bây giờ hãy quay lại lớp DBQuery
trong tệp DBSQLite.mqh
và thêm hỗ trợ liên kết dữ liệu.
class DBQuery
{
...
public:
template<typename T>
bool bind(const int index, const T value)
{
return PRTF(DatabaseBind(handle, index, value));
}
template<typename T>
bool bindBlob(const int index, const T &value[])
{
return PRTF(DatabaseBindArray(handle, index, value));
}
bool bindNull(const int index)
{
static const uchar null[] = {};
return bindBlob(index, null);
}
...
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
BLOB phù hợp để truyền bất kỳ tệp nào vào cơ sở dữ liệu mà không thay đổi, ví dụ, nếu bạn đọc nó trước vào một mảng byte bằng hàm FileLoad
FileLoad.
Nhu cầu liên kết rõ ràng một giá trị null không quá rõ ràng. Khi chèn các bản ghi mới vào cơ sở dữ liệu, chương trình gọi thường chỉ truyền các trường mà nó biết, và tất cả các trường còn thiếu (nếu chúng không được đánh dấu bằng ràng buộc NOT NULL hoặc không có giá trị DEFAULT khác trong mô tả bảng) sẽ tự động được động cơ để lại bằng NULL. Tuy nhiên, khi sử dụng cách tiếp cận ORM, việc ghi toàn bộ đối tượng vào cơ sở dữ liệu, bao gồm cả trường có khóa chính duy nhất (PRIMARY KEY), là thuận tiện. Đối tượng mới chưa có định danh này, vì chính cơ sở dữ liệu thêm nó khi đối tượng được ghi lần đầu tiên, nên việc liên kết trường này trong đối tượng mới với giá trị NULL là quan trọng.