3

複数のテーブルを ResultSet として返すストアド プロシージャがあります。私はそれをDataTableに保存し、そのDataTableオブジェクトをMY Webページにテーブルを印刷する別のフォームに渡しました。私の質問は、ストアド プロシージャから返された複数の ResultSet を、別の関数に返すことができる単一の 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;
}

3 つの DataTable すべてを受け取る関数

DataTable dtOutput = Generix.getGraphData(type);

ここから各 DataTable を取得する方法は? dtOutput1 への 0 番目の要素、dtOutput2 への 1 番目の要素を意味します。

4

2 に答える 2

2

podiluska が述べたようにデータセットを使用してから、DataSet.Tables プロパティにアクセスして、3 つのテーブルを 1 つずつ取得してみませんか。

3 つのテーブル構造が異なる場合、それらをテーブルに強制しても意味がありません。このためには、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

ストアド プロシージャでユニオンを使用して、結果セットを結合します

すなわち:

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);
于 2012-08-25T12:04:50.093 に答える