[英]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.