SQL Server 2008非常簡單,可以創建一個用戶定義的表類型並將父類型ID列表傳遞給該類型,或者您可以使用您首先獲得這些父類型ID的邏輯並加入到表中擁有兒童數據。
要創建的表類型,你讓這樣的事情:
CREATE TYPE [dbo].[Int32List]
AS TABLE (
[ID] int NOT NULL
);
GO
而且你的存儲過程是這樣的:
CREATE PROCEDURE [dbo].[MyStoredProc]
@ParentIDTable [dbo].[Int32List] READONLY
AS
--logic goes here
GO
你從這樣的C#代碼調用程序:
DataTable ParentIDs = new DataTable();
ParentIDs.Columns.Add("ID", typeof(int));
SqlConnection connection = new SqlConnection(yourConnectionInfo);
SqlCommand command = new SqlCommand("MyStoredProc", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@ParentIDTable", SqlDbType.Structured).Value = ParentIDs;
command.Parameters["@ParentIDTable"].TypeName = "Int32List";
這種方式很好,因爲這是一個很好的方式來有效地傳遞一個列表v到SQL Server的線索並將其視爲一張表。我使用的表格類型遍及我的應用程序,我想將一個值的數組傳遞給存儲過程。請記住,C#DataTable中的列名需要與您創建的表類型中的列名匹配,並且TypeName屬性需要與表類型的名稱匹配。
使用此方法,您只會對數據庫進行1次調用,並且在遍歷結果時,還應確保將ParentID包括在選擇列表中,以便您可以將每個子對象與適當的父對象進行匹配。
這裏有一個很好的資源,更詳細地解釋表類型:http://www.sommarskog.se/arrays-in-sql-2008.html
不GetChildrenByParentId()創建另一個連接,並調用另一個存儲過程? – Jason 2012-03-01 15:45:05
是的,它創建一個單獨的連接並調用一個單獨的存儲過程 – azamsharp 2012-03-01 15:45:39
您正在使用哪個版本的SQL Server? – Jason 2012-03-01 15:48:28