Basit bir örnek. Bu sadece id değeri 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 function() biraz kıvrık olan girişlerin sayısını yazdırır. Bu bir parametre alır ve başka bir parametre alır başka bir işlevi döndürür gibi, haskell bir curried (köri) işlevi benzer. Bu tarz bir şey.
Belgeleme diyor ki:
nasıl bu parametreleri geçmek? C++, bir işlev çağrısına sınırsız, değişken bir argüman sayısı iletmenize izin vermenin iyi bir yolu yoktur ve derleyici, kaç kişiden geçeceğinizi bilmez. Bunun bir hilesi var: geri aldığınız değeri bir parametre olarak adlandırmak için çağıran işlev olarak hazırlayabilirsiniz. Bu çağrıdan geri döndüğünüz şey yine aynıdır, böylece başka bir parametreyi geçmek için tekrar arayabilirsiniz. Bu şekilde tüm parametreleri Sınavı geçtikten sonra daha fazla parametre $ 1 $ 2 ve benzeri prepare
fonksiyonlarında kullanmak varsa
, sen çağırma
üzerinde exec arayarak parametrelerle deyimi çağırmak.
w.prepared("example")(dollar1_var)(dollar2_var).exec()
olarak
c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")
ve vermek Değişkenler dinamik hazırlanması için bir örnek, diğer veri tipleri bu fonksiyon tanımını kullanmak işlemek istiyorsanız
#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;
}
O çok kullanışlı! Teşekkürler bayım! Ve, lütfen, bu konuda biraz detaylandırın ve 'quote' yönteminin nerede kullanıldığını açıklayabilirsiniz. Bu yöntemde bir yerde göründüğüm gibi görünüyor, ama ben ifadeler hazırlamak veya başka bir iş yapmak için kullanılıp kullanılmadığından emin değilim. Bu yapıda olduğu gibi - 'w.prepared (" örnek ") (dollar1_var) (dollar2_var) .exec()' - gerçekten faydalıdır, fakat bazılarının keyfi sayıda parametreye dayanarak bunu dinamik olarak inşa edip edemeyeceğini bilmiyorum. Hazırlamak için - PHP '-' $ s-> execute ($ data) 'da gösterdiğim gibi bir şey, 'C++' da bunu uygulamak mümkün mü? – Jacobian
@Jacobian Dinamik hazırlık ile basit bir örnek ekledim. 'Alıntı' yöntemi ile hak ettiğiniz şeyi bilmiyorum. – keutoi
Çok teşekkür ederim! Harika bir cevap verdin! – Jacobian