Một ví dụ đơn giản. Thao tác này chỉ in số mục nhập có giá trị id bằng 0.
#include<pqxx/pqxx>
#include<iostream>
int main()
{
std::string name = "name";
int id = 0;
try {
//established connection to data base
pqxx::connection c("dbname=mydb user=keutoi");
pqxx::work w(c);
//statement template
c.prepare("example", "SELECT id FROM mytable WHERE id = $1");
//invocation as in varible binding
pqxx::result r = w.prepared("example")(id).exec();
w.commit();
//result handling for accessing arrays and conversions look at docs
std::cout << r.size() << std::endl;
}
catch(const std::exception &e)
{
std::cerr << e.what() << std::endl;
return 1;
}
return 0;
}
Hàm w.prepared () hơi phức tạp. Nó tương tự như một hàm curry (cà ri) trong haskell, vì hàm này nhận một tham số và trả về một hàm khác, lần lượt nó nhận một tham số khác. Đại loại vậy.
Tài liệu cho biết:
Làm thế nào để bạn vượt qua các tham số? C ++ không có cách nào tốt để cho phép bạn truyền số lượng đối số không giới hạn, có thể thay đổi cho một lệnh gọi hàm và trình biên dịch không biết bạn sẽ truyền bao nhiêu đối số. Có một mẹo nhỏ cho điều đó:bạn có thể coi giá trị bạn nhận lại từ việc chuẩn bị dưới dạng một hàm, mà bạn gọi để truyền một tham số. Những gì bạn nhận được từ cuộc gọi đó lại giống nhau, vì vậy bạn có thể gọi lại nó để chuyển một tham số khác, v.v.
Khi bạn đã chuyển tất cả các tham số theo cách này, bạn sẽ gọi câu lệnh với các tham số bằng cách gọi lệnh thực thi
Nếu có nhiều tham số hơn, hãy sử dụng $ 1 $ 2, v.v. trong prepare
chức năng.
c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")
và cung cấp các biến thể dưới dạng
w.prepared("example")(dollar1_var)(dollar2_var).exec()
Ví dụ về chuẩn bị động
#include<pqxx/pqxx>
#include<iostream>
#include<vector>
//Just give a vector of data you can change the template<int> to any data type
pqxx::prepare::invocation& prep_dynamic(std::vector<int> data, pqxx::prepare::invocation& inv)
{
for(auto data_val : data)
inv(data_val);
return inv;
}
int main()
{
std::string name = "name";
//a data array to be used.
std::vector<int> ids;
ids.push_back(0);
ids.push_back(1);
try {
pqxx::connection c("dbname=mydb user=keutoi");
pqxx::work w(c);
c.prepare("example", "SELECT id FROM mytable WHERE id = $1 or id = $2");
pqxx::prepare::invocation w_invocation = w.prepared("example");
//dynamic array preparation
prep_dynamic(ids, w_invocation);
//executing prepared invocation.
pqxx::result r = w_invocation.exec();
w.commit();
std::cout << r.size() << std::endl;
}
catch(const std::exception &e)
{
std::cerr << e.what() << std::endl;
return 1;
}
return 0;
}
nếu bạn muốn xử lý các kiểu dữ liệu khác, hãy sử dụng định nghĩa hàm này
template<class T> pqxx::prepare::invocation& prep_dynamic(std::vector<T> data, pqxx::prepare::invocation& inv)
{
for(auto data_val : data)
inv(data_val);
return inv;
}