我有存储过程,它返回多个表作为ResultSet。我将其存储在DataTable中,并将该DataTable对象传递给在我的Web页中打印表的另一种形式。
我的问题是如何将存储过程返回的多个结果集存储到可以返回到另一个函数的单个数据表对象中。

    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 .....就像

最佳答案

为什么不使用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];

关于c# - 从单个DataTable对象中的存储过程返回多个结果集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12121758/

10-09 08:40
查看更多