0

こんにちは、友達。使用pqxxしていますが、いくつか質問があります。

1. 1 対多の関係を持つ 2 つのテーブルがあり table1 (table1_id integer) and table2 (table1_id integer, another_id integer)ます。table1_id、vector another_ids のようなビューで情報を簡単に取得するにはどうすればよいですか? 現在、スクリプトでシリアル化 (string concat into "%d %d %d...") を使用し、C++ コードで逆シリアル化を使用しています。また、table1 に値を挿入する必要があります。そして、どうすれば1回のトランザクションでこれを行うことができますか?

2.次のようなストアドプロシージャを呼び出します

    t.exec("SELECT * FROM my_proc(some_argument)");

C#のようにこれを行う方法が存在する可能性がありますか?

どうもありがとうございました!

4

1 に答える 1

0

だから、それは誰かを助けることができるかもしれません。

最初のケースでは、次の 2 つの方法を見つけて使用します。1. SQL 関数でのグループ連結と C++ での逆シリアル化。table2 に table1_id と別の整数しかない場合は高速です。2. get_table1() と get_table2() の 2 つの関数を table1_id の順序で呼び出します。次に、2 つのポインターを使用して、table1 の配列を作成します。

std::vector<Table1> table1Array;
auto ap = wrk.prepared(GetTable1FuncName).exec();
auto aps = wrk.prepared(GetTable2FuncName).exec();
auto pos = aps.begin();
for (auto row = ap.begin(); row != ap.end(); ++row) {
    std::vector<Table2> table2Array;
    while (pos != aps.end()
           && row["table1_id"].as(int()) == pos["table1_id"].as(int())) {
        table2Array.push_back(Table2(pos["first_id"].as(int()), 
                                     pos["second_string"].as(std::string())));
        ++pos;
    }

    Table1 tb1(row["table1_id"].as(int()), row["column2"].as(int()),
               row["column3"].as(int()), row["column4"].as(int()),
               table2Array);

    table1Array.push_back(tb1);
}

きれいではないかもしれませんが、機能しています。データベースに挿入 1 つの要素に対して書き込みます。最初に Table1 に挿入し、数行後に Table2 に挿入します。通話後pqxx::work.commit()

2 番目のケースでは Not、存在しません。また、関数は常に 1 行を返すことも忘れないでください。気をつけて!

于 2016-09-30T04:32:52.927 に答える