Thực thi các truy vấn đã chuẩn bị: DatabaseRead/Bind
Các truy vấn đã chuẩn bị được thực thi bằng các hàm DatabaseRead
và DatabaseReadBind
. Hàm đầu tiên trích xuất kết quả từ cơ sở dữ liệu theo cách mà sau đó các trường riêng lẻ có thể được đọc từ mỗi bản ghi nhận được lần lượt trong phản hồi, và hàm thứ hai trích xuất từng bản ghi phù hợp một cách trọn vẹn, dưới dạng một cấu trúc.
bool DatabaseRead(int request)
Trong lần gọi đầu tiên, sau Database Prepare
Database Prepare hoặc DatabaseReset
DatabaseReset, hàm DatabaseRead
thực thi truy vấn và đặt con trỏ kết quả truy vấn nội bộ đến bản ghi đầu tiên được lấy ra (nếu truy vấn kỳ vọng trả về các bản ghi). Các hàm DatabaseColumn
DatabaseColumn cho phép đọc giá trị của các trường bản ghi, tức là các cột được chỉ định trong truy vấn.
Trong các lần gọi tiếp theo, hàm DatabaseRead
nhảy đến bản ghi tiếp theo trong kết quả truy vấn cho đến khi kết thúc.
Hàm trả về true
khi hoàn thành thành công. Giá trị false
được sử dụng như một chỉ báo lỗi (ví dụ, cơ sở dữ liệu có thể bị khóa hoặc bận), cũng như khi kết thúc kết quả được đạt đến một cách bình thường, vì vậy bạn nên phân tích mã trong _LastError
. Đặc biệt, giá trị ERR_DATABASE_NO_MORE_DATA (5126) cho biết kết quả đã hoàn tất.
Chú ý! Nếu
DatabaseRead
được sử dụng để thực thi các truy vấn không trả về dữ liệu, chẳng hạn như INSERT, UPDATE, v.v., hàm sẽ ngay lập tức trả vềfalse
và đặt mã lỗi ERR_DATABASE_NO_MORE_DATA nếu yêu cầu thành công.
Mẫu sử dụng thông thường của hàm được minh họa bằng đoạn mã giả sau (các hàm DatabaseColumn
cho các kiểu khác nhau được trình bày trong phần tiếp theo).
int r = DatabasePrepare(db, "SELECT... WHERE...",
param)); // biên dịch truy vấn (tùy chọn với tham số)
while(DatabaseRead(r)) // thực thi truy vấn (ở lần lặp đầu tiên)
{ // và lặp qua các bản ghi kết quả
int count;
DatabaseColumnInteger(r, 0, count); // đọc một trường từ bản ghi hiện tại
double number;
DatabaseColumnDouble(r, 1, number); // đọc một trường khác từ bản ghi hiện tại
... // kiểu cột và số trong bản ghi được xác định bởi chương trình
// xử lý các giá trị nhận được của count, number, v.v.
} // vòng lặp bị gián đoạn khi kết thúc kết quả
DatabaseFinalize(r);
2
3
4
5
6
7
8
9
10
11
12
Lưu ý rằng vì truy vấn (đọc dữ liệu có điều kiện) thực sự chỉ được thực thi một lần (ở lần lặp đầu tiên), không cần gọi DatabaseReset
DatabaseReset, như chúng ta đã làm khi ghi dữ liệu thay đổi. Tuy nhiên, nếu chúng ta muốn chạy lại truy vấn và "đi qua" các kết quả mới, việc gọi DatabaseReset
sẽ là cần thiết.
bool DatabaseReadBind(int request, void &object)
Hàm DatabaseReadBind
hoạt động tương tự như DatabaseRead
: lần gọi đầu tiên thực thi truy vấn SQL và, trong trường hợp thành công (có dữ liệu phù hợp trong kết quả), điền cấu trúc object
được truyền bằng tham chiếu với các trường của bản ghi đầu tiên; các lần gọi tiếp theo tiếp tục di chuyển con trỏ nội bộ qua các bản ghi trong kết quả truy vấn, điền cấu trúc với dữ liệu của bản ghi tiếp theo.
Cấu trúc phải chỉ có các kiểu số và/hoặc chuỗi làm thành viên (không cho phép mảng), không thể kế thừa từ hoặc chứa các thành viên tĩnh của kiểu đối tượng.
Số lượng trường trong cấu trúc object
không được vượt quá số lượng cột trong kết quả truy vấn; nếu không, chúng ta sẽ nhận được lỗi. Số lượng cột có thể được tìm thấy động bằng hàm DatabaseColumnsCount
DatabaseColumnsCount, tuy nhiên, người gọi thường cần "biết" trước cấu hình dữ liệu mong đợi theo yêu cầu ban đầu.
Nếu số lượng trường trong cấu trúc ít hơn số lượng trường trong bản ghi, một lần đọc một phần sẽ được thực hiện. Phần dữ liệu còn lại có thể được lấy bằng các hàm DatabaseColumn
DatabaseColumn phù hợp.
Giả định rằng các kiểu trường của cấu trúc khớp với các kiểu dữ liệu trong cột kết quả. Nếu không, một chuyển đổi ngầm tự động sẽ được thực hiện, điều này có thể dẫn đến hậu quả không mong muốn (ví dụ, một chuỗi đọc vào trường số sẽ cho kết quả 0).
Trong trường hợp đơn giản nhất, khi chúng ta tính toán một giá trị tổng nào đó cho các bản ghi cơ sở dữ liệu, ví dụ, bằng cách gọi hàm tổng hợp như SUM(column)
, COUNT(column)
, hoặc AVERAGE(column)
, kết quả của truy vấn sẽ là một bản ghi duy nhất với một trường duy nhất.
SELECT SUM(swap) FROM trades;
Vì việc đọc kết quả liên quan đến các hàm DatabaseColumn
, chúng ta sẽ hoãn việc phát triển ví dụ cho đến phần tiếp theo, nơi chúng được trình bày.