एक साधारण उदाहरण। यह सिर्फ आईडी मान 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;
}
फ़ंक्शन w.prepared() थोड़ा जटिल है। यह हैकेल में एक करीबी (करी) फ़ंक्शन के समान है, क्योंकि इसमें एक पैरामीटर लेता है और दूसरा फ़ंक्शन देता है जो बदले में एक और पैरामीटर लेता है। उस तरह की बात।
दस्तावेज़ीकरण कहता है:
<ब्लॉकक्वॉट>आप उन मापदंडों को कैसे पास करते हैं? सी ++ के पास फ़ंक्शन कॉल में असीमित, परिवर्तनीय संख्या तर्कों को पारित करने का कोई अच्छा तरीका नहीं है, और संकलक यह नहीं जानता कि आप कितने पास करने जा रहे हैं। इसके लिए एक तरकीब है:आप एक फ़ंक्शन के रूप में तैयार किए गए मान का इलाज कर सकते हैं, जिसे आप एक पैरामीटर पास करने के लिए कहते हैं। उस कॉल से आपको जो वापस मिलता है वह फिर से वही होता है, इसलिए आप इसे फिर से कॉल कर सकते हैं और एक और पैरामीटर पास कर सकते हैं।
एक बार जब आप इस तरह से सभी पैरामीटर पास कर लेते हैं, तो आप कॉल करके पैरामीटर के साथ स्टेटमेंट को इनवोकेशन पर कॉल कर सकते हैं
यदि अधिक पैरामीटर हैं तो $1 $2 का उपयोग करें और इसी तरह prepare
. में समारोह।
c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")
और चर को इस रूप में दें
w.prepared("example")(dollar1_var)(dollar2_var).exec()
गतिशील तैयारी के लिए एक उदाहरण
#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;
}
यदि आप अन्य डेटा प्रकारों को संभालना चाहते हैं तो इस फ़ंक्शन परिभाषा का उपयोग करें
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;
}