PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách chuẩn bị các câu lệnh và tham số liên kết trong Postgresql cho C ++

Một ví dụ đơn giản. Thao tác này chỉ in số mục nhập có giá trị id bằng 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;
}

Hàm w.prepared () hơi phức tạp. Nó tương tự như một hàm curry (cà ri) trong haskell, vì hàm này nhận một tham số và trả về một hàm khác, lần lượt nó nhận một tham số khác. Đại loại vậy.

Tài liệu cho biết:

Làm thế nào để bạn vượt qua các tham số? C ++ không có cách nào tốt để cho phép bạn truyền số lượng đối số không giới hạn, có thể thay đổi cho một lệnh gọi hàm và trình biên dịch không biết bạn sẽ truyền bao nhiêu đối số. Có một mẹo nhỏ cho điều đó:bạn có thể coi giá trị bạn nhận lại từ việc chuẩn bị dưới dạng một hàm, mà bạn gọi để truyền một tham số. Những gì bạn nhận được từ cuộc gọi đó lại giống nhau, vì vậy bạn có thể gọi lại nó để chuyển một tham số khác, v.v.

Khi bạn đã chuyển tất cả các tham số theo cách này, bạn sẽ gọi câu lệnh với các tham số bằng cách gọi lệnh thực thi

Nếu có nhiều tham số hơn, hãy sử dụng $ 1 $ 2, v.v. trong prepare chức năng.

c.prepare("SELECT id name FROM mytable WHERE id = $1 AND name = $2")

và cung cấp các biến thể dưới dạng

w.prepared("example")(dollar1_var)(dollar2_var).exec()

Ví dụ về chuẩn bị động

#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;
}

nếu bạn muốn xử lý các kiểu dữ liệu khác, hãy sử dụng định nghĩa hàm này

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi PostgreSQL:Đã tồn tại quan hệ

  2. lỗi câu lệnh sql:cột .. không tồn tại

  3. Trong PostgreSQL, làm thế nào để chèn dữ liệu bằng lệnh COPY?

  4. Các đối tượng lớn có thể không được sử dụng trong chế độ tự động cam kết

  5. Cách thoát khỏi Tiện ích dòng lệnh PostgreSQLs (psql)