我有Stored Procedure,它将多个表作为ResultSet返回。我在DataTable中存储它并将该DataTable对象传递给在我的网页中打印表的另一个表单。 我的问题是我如何存储多个ResultSet从存储过程返回到SINGLE DataTable对象,我可以返回到另一个函数。
public static DataTable[] getGraphData(Int32 type)
{
SqlConnection oConn = null;
DataSet dsReturn = null;
DataTable[] dtReturn=new DataTable[2];
try
{
getConnection(ref oConn, 1);
using (SqlStoredProcedure sspObj = new SqlStoredProcedure("dbo.usp_getGraphData", oConn, CommandType.StoredProcedure))
{
sspObj.AddParameterWithValue("@Type", SqlDbType.Int, 0, ParameterDirection.Input, type);
dsReturn = sspObj.ExecuteDataSet();
dtReturn[0] = dsReturn.Tables[0];
dtReturn[1] = dsReturn.Tables[1];
dtReturn[2] = dsReturn.Tables[2];
sspObj.Dispose();
}
closeConnection(ref oConn);
}
catch (Exception xObj)
{
//dtReturn[] = new DataTable();
}
return dtReturn;
}
采用所有三个DataTable的功能
DataTable dtOutput = Generix.getGraphData(type);
如何从这里获取每个DataTable?意味着第0个元素到dtOutput1,第一个元素到dtOutput2 .....同样聪明
答案 0 :(得分:2)
为什么不使用podiluska提到的数据集,然后访问DataSet.Tables属性以逐个获取三个表。
如果三个表结构不同,那么将它们放入表中是没有意义的。为此,DataSet是更好的方法。它是你桌子的一种收藏。
编辑有关DataTable []的问题:
DataTable[] dtOutputs = Generix.getGraphData(type);
//dtReturn[0]
DataTable dtOutput0 = dtOutputs[0];
//dtReturn[1]
DataTable dtOutput1 = dtOutputs[1];
//dtReturn[2]
DataTable dtOutput2 = dtOutputs[2];
或者如果你不仅需要引用那些表,而是复制它们,你可以使用.Copy()之类的:
//dtReturn[0]
DataTable dtOutput1 = dtOutputs[1].Copy;
我仍然认为最好的方法是通过查询返回一个DataSet(从那里做一个DataTable查询是没有意义的。)
public static DataSet getGraphData(Int32 type)
{
SqlConnection oConn = null;
DataSet dsReturn = null;
try
{
getConnection(ref oConn, 1);
using (SqlStoredProcedure sspObj = new SqlStoredProcedure("dbo.usp_getGraphData", oConn, CommandType.StoredProcedure))
{
sspObj.AddParameterWithValue("@Type", SqlDbType.Int, 0, ParameterDirection.Input, type);
dsReturn = sspObj.ExecuteDataSet();
//You don't need Dispose() - because the using will do that on sspObj
}
closeConnection(ref oConn);
}
catch (Exception xObj)
{
dsReturn = new DataSet("Empty");
}
return dsReturn ;
}
并调用这样的方法:
DataSet dsOutput = Generix.getGraphData(type);
//Simply a reference or Copy() the DataSet's tables:
DataTable dtOutput0 = dsOutput.Tables[0];
DataTable dtOutput1 = dsOutput.Tables[1];
DataTable dtOutput2 = dsOutput.Tables[2];
答案 1 :(得分:0)
在存储过程中使用union将结果集连接在一起
即:
SELECT * from yourtable WHERE name='bob'
UNION ALL
SELECT * from yourtable WHERE name='jane'
如果要将多个表返回到单个对象,可以使用DataSet
(包含多个表)而不是DataTable
。你以同样的方式填充它。
例如:
DataSet dst = new DataSet();
new SqlAdapter(command).Fill (dst);