C++

2015-08-05 4 views
5

için Postgresql'de ifadeler nasıl hazırlanır ve parametreleri bağlanır C++ için oldukça yeni ve pqxx kitaplığından biraz haberdarım. Benim uygulamak istediğim ifadeler hazırlamak ve parametreleri bağlamaktır.C++

$data = array(); 
$data[] = 1; 
$data[] = 2; 
$s = $db->prepare("SELECT id FROM mytable WHERE id = ? or id = ?"); 
$s->execute($data); 

Bunun nasıl uygulanacağı pqxx documentation dışarı fugure çalıştı, ancak bunlarla:

$s = $db->prepare("SELECT id FROM mytable WHERE id = :id"); 
$s->bindParam(':id', $id); 
$s->execute(); 

veya kullanan belirteçleri: PHP ben böyle güzel ve özlü bir şekilde bunu yapmaya alışkın değilim Belgeleme bir karmaşaya benziyor ve kısa ve basit örneklerden yoksun (yukarıda verdiğim gibi). Birisinin C++ numaralı telefondan Postgresql ile uğraşırken bu tür basit örnekler (veya bazı basit kodlar yazmadan) ile benzer basit örnekler sağlayabileceğini umuyorum.

cevap

8

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; 
} 
+0

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

+0

@Jacobian Dinamik hazırlık ile basit bir örnek ekledim. 'Alıntı' yöntemi ile hak ettiğiniz şeyi bilmiyorum. – keutoi

+0

Çok teşekkür ederim! Harika bir cevap verdin! – Jacobian