Een eenvoudig voorbeeld. Dit drukt gewoon het aantal inzendingen af met id-waarde 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;
}
De functie w.prepared() is een beetje ingewikkeld. Het is vergelijkbaar met een curried (curry) -functie in haskell, omdat het een parameter nodig heeft en een andere functie retourneert die op zijn beurt een andere parameter nodig heeft. Dat soort dingen.
Documentatie zegt:
Hoe geef je die parameters door? C++ heeft geen goede manier om je een onbeperkt, variabel aantal argumenten door te geven aan een functieaanroep, en de compiler weet niet hoeveel je er gaat doorgeven. Daar is een trucje voor:je kunt de waarde die je terugkrijgt van prepare behandelen als een functie, die je aanroept om een parameter door te geven. Wat je terugkrijgt van die aanroep is weer hetzelfde, dus je kunt het opnieuw aanroepen om een andere parameter door te geven enzovoort.
Zodra u alle parameters op deze manier hebt doorgegeven, roept u de instructie met de parameters op door exec op de aanroep aan te roepen
Als er meer parameters zijn, gebruik dan $1 $2 enzovoort in de prepare
functie.
c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")
en geef de variabelen als
w.prepared("example")(dollar1_var)(dollar2_var).exec()
Een voorbeeld voor dynamische voorbereiding
#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;
}
als u andere gegevenstypen wilt verwerken, gebruik dan deze functiedefinitie
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;
}