Contoh sederhana. Ini hanya mencetak jumlah entri dengan nilai id 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;
}
Fungsi w.prepared() agak berbelit-belit. Ini mirip dengan fungsi kari (kari) di haskell, karena di dalamnya mengambil parameter dan mengembalikan fungsi lain yang pada gilirannya mengambil parameter lain. Hal semacam itu.
Dokumentasi mengatakan:
Bagaimana Anda melewati parameter itu? C++ tidak memiliki cara yang baik untuk membiarkan Anda meneruskan jumlah variabel argumen yang tidak terbatas ke panggilan fungsi, dan kompiler tidak tahu berapa banyak yang akan Anda lewati. Ada trik untuk itu:Anda dapat memperlakukan nilai yang Anda dapatkan kembali dari disiapkan sebagai fungsi, yang Anda panggil untuk meneruskan parameter. Apa yang Anda dapatkan kembali dari panggilan itu adalah sama lagi, sehingga Anda dapat memanggilnya lagi untuk meneruskan parameter lain dan seterusnya.
Setelah Anda melewati semua parameter dengan cara ini, Anda memanggil pernyataan dengan parameter dengan memanggil exec pada permintaan
Jika ada lebih banyak parameter gunakan $1 $2 dan seterusnya di prepare
fungsi.
c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")
dan berikan variabelnya sebagai
w.prepared("example")(dollar1_var)(dollar2_var).exec()
Contoh untuk persiapan dinamis
#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;
}
jika Anda ingin menangani tipe data lain gunakan definisi fungsi ini
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;
}