从存储过程返回多个表
Posted
技术标签:
【中文标题】从存储过程返回多个表【英文标题】:Returning multiple tables from a stored procedure 【发布时间】:2011-11-06 13:20:03 【问题描述】:在我的 winform 应用程序中,我有以下场景:
我想在一个事件中获得多个表。在single server cycle,
中将所有表返回为dataset
或一次获取一张表并使用separate server cycle for each table
哪个更好?各有什么优势?
【问题讨论】:
一次性获取它们会减少请求的数量 - 但您需要更多的内存。仅在需要时获取它们可能会更好,如果有一些您不经常需要的表 - 仅在您真正需要它们时加载它们 为什么是-1??谁投了反对票? 这是一个根据应用程序大小、资源可用性和业务需求而变化的设计决策。这两种技术都是可能的。您可以根据业务环境选择其中一个。如果您想知道如何选择,您应该提供有关客户端环境、数据库负载、在线/离线状态、进行数据库调用的成本、根据需要获取数据的业务准备情况等更具体的信息。 【参考方案1】:正常的方法是一次全部搞定。
只需构建您的SELECT
,您将拥有一个包含所有表格的DataSet
。
using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(myConnString))
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
cmd.CommandText = "myMultipleTablesSP";
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
conn.Close();
例如,如果您在 SP 中返回 2 个表,例如:
SELECT * FROM [TableA];
SELECT * FROM [TableB];
您可以通过以下方式访问这些表:
DataTable tableA = ds.Tables[0];
DataTable tableB = ds.Tables[1];
【讨论】:
这不是我需要的......我只是想知道哪个更好。 在 Windows 应用程序中,最好是我建议的示例。 DataSet 中返回的表是否总是与它们在 SP 中选择的顺序相同?【参考方案2】:如果您单独加载每个表并使用线程,您可以大大提高性能。
数据集也很重...所以尽量避免使用它们。
【讨论】:
这是一个windows应用程序,你不需要避免DataSets,它们的存在是有原因的!在 Windows 应用程序中,您拥有 CPU 的所有功能,只为您的应用程序! 我同意 DataSet 可能非常繁重 - 但是管理多个线程以加载多个表(即,每个表一个线程)的开销可能会让人头疼,而且你也在做 x 到数据库服务器的连接,而不是一个。 @C0deNinja - 我不认为 balexandre 建议效率低下;在代码方面,效率和可维护性之间有一条细线。如果代码如此高效以至于不容易维护,那么它就不是真正的高效 (IMO)。 @tim 我同意...我只是在说明进行单独通话的一个优点。 你有链接 RE: 数据集性能而不是替代集合吗?我经常看到这种说法,但从未见过任何数字。以上是关于从存储过程返回多个表的主要内容,如果未能解决你的问题,请参考以下文章
如何将单个结果集从返回多个集的 SQL 存储过程保存到临时表?
从返回多个实际表的复杂存储过程中检索 asp.net MVC 中的数据