2011-11-30 62 views
0

有什麼辦法可以將DataSet用作IN'值'?在數據集中選擇值

例如,我有一個查詢加載一個DataSet的選項,用戶可以在他們的工作時進行選擇。問題是,加載DataSet的查詢非常長且艱苦(在其他選擇和其他表連接中選擇和連接表等)等等,所以我希望能夠一次性填充DataSet ,並在運行其他查詢時引用DataSet。

現在,我已經通過調用每一行,從行中獲取值並將其附加到查詢來實現它。

//GetAvailableOptions is just the long and complicated query 
//Code simplified just for example sake 
DataSet ds = GetAvailableOptions(); 
string str_qry = "select from TestFile where ("; 
foreach(DataRow dr in ds.Tables[0].Rows) 
{ 
    string str_test = dr[0].ToString(); 
    str_qry += dr[0].ToString() + " or "; 
} 

所以結果查詢是這樣的:

select from TestFile where (TestField = 'A' or TestField = 'B' or ... TestField = 'Z') 

但如果我不能使它更快通過執行以下操作我想知道:

DataSet ds = GetAvailableOptions(); 
string str_qry = "select from TestFile where TestField in " + ds.Tables[0].Columns[0]; 

但我可以」讓它工作。這可能嗎?我的邏輯聲音是?我試圖從DataSet引用的Column的名稱與我試圖加載的字段(在本例中爲TestField)相同。

另外,我在想更主觀的問題是,如果這樣做會工作多快(如果是的話?)會是多少?或者甚至連接和多個查詢,從那裏拉取而不是循環和追加會更快嗎?或者,如果有另一種我沒有想到的方式?有人能分享他們的經驗嗎?

回答

1

這聽起來像是一個更好的存儲過程。我假設你正在創建的DataSet是從存儲過程中填充的?

此外,由於多種原因,您生成的動態SQL類型並非最佳實踐,其中最主要的是安全性,您可以打開自己的SQL注入。

1

有一件事,儘管你提到返回你後面的列的數據是一個複雜的連接,如果是的話,這實際上是否都可以在服務器上完成?因此,將一個新的存儲過程放在一起,以反映初始複雜的用戶數據,然後依次運行您在服務器上的客戶端上構建的選擇?

+0

我投這個票,因爲這確實提供了一個更好的方式來做到這一點。然而,僅僅爲了教育的目的,你知道我最初提出的做法是否可以做到嗎? – Gobbledigook

相關問題