簡體   English   中英

如何使用SOCI為SELECT *編碼?

[英]How to code for SELECT * with SOCI?

在大多數關於SOCI的示例中,調用方必須知道查詢中的字段和類型,並通過boost::tuple<>soci::rowset<> boost::tuple<>或通過其他某種方式來指定它們。

有沒有一種方法可以像SELECT * FROM ...查詢中那樣事先知道列的類型和數量?

如果是這樣,您可以舉個簡短的例子嗎?

soci::rowset<soci::row>正是您所需要的— soci::row提供了動態綁定。

從文檔:

對於某些應用,期望能夠從任意結構化的表中選擇數據(例如,通過“ select * from ...”),並根據其類型格式化結果數據。 SOCI通過soci :: row和soci :: column_properties類支持此功能。

看到:

http://soci.sourceforge.net/doc/3.2/exchange.html#dynamic
http://soci.sourceforge.net/doc/3.2/statements.html#rowset

有關詳細信息。

文檔摘錄:

例如,下面的代碼從任意表的選定數據行中創建一個XML文檔:

row r;
sql << "select * from some_table", into(r);

std::ostringstream doc;
doc << "<row>" << std::endl;
for(std::size_t i = 0; i != r.size(); ++i)
{
    const column_properties & props = r.get_properties(i);

    doc << '<' << props.get_name() << '>';

    switch(props.get_data_type())
    {
    case dt_string:
        doc << r.get<std::string>(i);
        break;
    case dt_double:
        doc << r.get<double>(i);
        break;
    case dt_integer:
        doc << r.get<int>(i);
        break;
    case dt_long_long:
        doc << r.get<long long>(i);
        break;
    case dt_unsigned_long_long:
        doc << r.get<unsigned long long>(i);
        break;
    case dt_date:
        std::tm when = r.get<std::tm>(i);
        doc << asctime(&when);
        break;
    }

    doc << "</" << props.get_name() << '>' << std::endl;
}
doc << "</row>";

應該傳遞給row :: get()的Type T參數取決於從column_properties :: get_data_type()返回的SOCI數據類型。

我不相信有辦法。 可能是因為“選擇*”通常被認為是危險的。 可以添加列,重新排序等,現在查詢已斷開。 節省您將來的調試工作,並列出各列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM