3

我有存储过程,它返回多个表作为结果集。我将它存储在 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 dtOutput = Generix.getGraphData(type);

如何从这里获取每个数据表?表示第 0 个元素到 dtOutput1 ,第一个元素到 dtOutput2 ..... 明智的

4

2 回答 2

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];
于 2012-08-25T12:32:21.310 回答
0

在存储过程中使用联合将结果集连接在一起

IE:

SELECT * from yourtable WHERE name='bob'
UNION ALL
SELECT * from yourtable WHERE name='jane'

如果要将多个表返回到一个对象中,可以使用 a DataSet(包含多个表)而不是DataTable. 您以相同的方式填充它。

例如:

DataSet dst = new DataSet();
new SqlAdapter(command).Fill (dst);
于 2012-08-25T12:04:50.093 回答