1

サンプルコード:

pqxx::connection c("user=postgres");
pqxx::work txn(c);
pqxx::result r = txn.exec("SELECT d.datname as \"Name\","
       "pg_catalog.pg_get_userbyid(d.datdba) as \"Owner\","
       "pg_catalog.pg_encoding_to_char(d.encoding) as \"Encoding\","
       "d.datcollate as \"Collate\","
       "d.datctype as \"Ctype\","
       "pg_catalog.array_to_string(d.datacl, E'\\n') AS \"Access privileges\""
       "   FROM pg_catalog.pg_database d"
       "   ORDER BY 1");
try {
  for(int rownum=0; rownum<r.size(); ++rownum ) {
    const pqxx::result::tuple row = r[rownum];
    std::cout << "Column 0 Name: \'" << row[0].name() << "\': " << row[0].c_str() << std::endl;
    const std::string s = "Name";
    std::cout << (row[0].name() == s) << std::endl;
    std::cout << "dbname: \'" << row[s].c_str() << "\'" << std::endl; // Exception here
  }
} catch(const pqxx::argument_error &e) {
  std::cout << "Argument Error: " << e.what() << std::endl;
}

私の出力は次のとおりです

Column 0 Name: 'Name': mydb
1
Argument Error: Unknown column name: 'Name'

最初の列名は「名前」で、行名を文字列「名前」に対してテストすると、真のステートメントが生成されます。しかし、その文字列でアクセスすると、例外が発生します。

4

1 に答える 1

4

わかりました、完全に愚かです。大文字などを機能させたい場合は、名前を引用する必要があります。

とても変化しています

const std::string s = "Name";

const std::string s = "\"Name\"";

問題を修正します。どうやら、C インターフェースはあなたが呼ぶものを小文字にしますが、テスト対象のフィールドは小文字にしません。ARG!それを理解するには、libpqxx コードを調べなければなりませんでした。

于 2014-09-27T06:23:18.693 に答える