在大多數SOCI的示例中,調用者必須知道查詢中的字段和類型,並通過soci::rowset<>
的boost::tuple<>
或通過其他方式指定它們。如何使用SOCI對SELECT *進行編碼?
有沒有辦法代碼沒有事先知道列的類型和數量,如在SELECT * FROM ...
查詢?
如果是這樣,你可以發佈一個簡短的例子嗎?
在大多數SOCI的示例中,調用者必須知道查詢中的字段和類型,並通過soci::rowset<>
的boost::tuple<>
或通過其他方式指定它們。如何使用SOCI對SELECT *進行編碼?
有沒有辦法代碼沒有事先知道列的類型和數量,如在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
瞭解詳情。從文檔
摘錄:
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>";
的:
例如,下面的代碼從任意的表中創建從數據中所選擇的行的XML文檔應該傳遞給row :: get()的T型參數取決於從column_properties :: get_data_type()返回的SOCI數據類型。
我不相信有一種方法。可能是因爲'select *'通常被認爲是危險的。列可以被添加,重新排序等,你的查詢現在被打破。保存你的未來自己的一些調試,並列出列。
在大多數情況下,我同意你的看法。但是,在某些特殊情況下,如用於編輯任意表格的GUI,它可能很有用。如果功能可用,可以編寫一個通用實用程序,它可以工作,而不管列排序等... – kfmfe04
哦,你的鏈接是相同的。 – vines
即使鏈接是相同的accetically答案(這是現在已經過時了),它至少會給出一些小提示,尋找什麼。 – Devolus
@Devolus感謝您指出,我已經更新了答案。 – vines