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