2009-04-12 69 views
6

我在Microsoft SQL Server 2005的存儲過程中編寫了三條select語句。兩個select語句都爲select語句返回多個記錄和表列表是不同的。一個從主表中選擇記錄,另一個從子表中選擇記錄。在C#代碼中,我想獲取所有這些記錄並將所有數據放入一個對象中。我正在使用SqlDataReader。它可能與它或我應該做別的。如何在存儲過程中使用多個select語句的情況下使用SqlDataReader

回答

17

您可以在數據採集器上使用the NextResult方法來使用查詢中的多個結果進行導航。

要遍歷所有的數據,你會做這樣的事情:

var moreResults = true; 
while (moreResults) 
{ 
    while (reader.Read()) 
    { 
    ... 
    } 
    moreResults = reader.NextResult(); 
} 

所以作爲背景,並假設主結果集至上,填充主機和明細對象可以這樣做:

首先,建立的主記錄的字典:

var masters = new Dictionary<int, Master>(); 

var idOrdinal = reader.GetOrdinal("id"); 
while (reader.Read()) 
{ 
    var id = reader.GetInt32(idOrdinal); 
    masters.Add(id, new Master{Id=id, ....}); 
} 

接下來,移動到詳細記錄,並添加這些到其對應的主:

reader.NextResult(); 

var masterIdOrdinal = reader.GetOrdinal("masterId"); 
while (reader.Read()) 
{ 
    var masterId = reader.GetInt32(masterIdOrdinal); 

    var master = masters[masterId]; 
    master.Details.Add(new Detail{....}); 
} 

您應該明確地將列名替換爲數據中的內容,並提供Master和Detail對象的完整初始化。 如果詳細結果集在主ID上排序,則可以優化最後一個循環,以便僅從字典中查找一次每個主。如果結果集雖小,但收益不會那麼大。

+0

很好的答案,但我認爲你會留下部分問題沒有答案。 ;-) – Cerebrus 2009-04-12 12:37:10

2

...從主表 和子表另一個選擇。在記錄的C#代碼 我想這一切的記錄,並把 所有這些數據在一個對象...

Peter的解決方案解決了用單個DataReader檢索多個結果的基本問題。但是,如果要將數據保存到複製Master-Details表之間關係的對象,則應該使用DataSet代替。

數據集可以包含多個DataTable s,並通過允許在表之間創建DataRelation s來充分支持表之間的固有關係。然後,您可以分別通過Master或Details表中的GetChildRows()GetParentRows()獲取每個場景的相關記錄。

網上可能有很多示例說明如何做到這一點。 Here's one discussion thread來自我的組,其中列出了步驟並提供了一些代碼來演示該過程。

+0

謝謝。現在,我已經完成了我開始的工作:) – 2009-04-12 16:24:43

相關問題