2012-10-31 21 views
0

在大多數SOCI的示例中,調用者必須知道查詢中的字段和類型,並通過soci::rowset<>boost::tuple<>或通過其他方式指定它們。如何使用SOCI對SELECT *進行編碼?

有沒有辦法代碼沒有事先知道列的類型和數量,如在SELECT * FROM ...查詢?

如果是這樣,你可以發佈一個簡短的例子嗎?

回答

3

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數據類型。

+0

哦,你的鏈接是相同的。 – vines

+0

即使鏈接是相同的accetically答案(這是現在已經過時了),它至少會給出一些小提示,尋找什麼。 – Devolus

+1

@Devolus感謝您指出,我已經更新了答案。 – vines

0

我不相信有一種方法。可能是因爲'select *'通常被認爲是危險的。列可以被添加,重新排序等,你的查詢現在被打破。保存你的未來自己的一些調試,並列出列。

+1

在大多數情況下,我同意你的看法。但是,在某些特殊情況下,如用於編輯任意表格的GUI,它可能很有用。如果功能可用,可以編寫一個通用實用程序,它可以工作,而不管列排序等... – kfmfe04

相關問題