DOBON.NET DOBON.NETプログラミング掲示板過去ログ

【C#】DataSetの動的取得方法

分類:[.NET]


いつもお世話になっております。
質問をお願い致します。

以下のようなメソッドで、複数のレコードをもつ、TEST_CD1〜3を取得し、
DataSetに格納します。

public DataSet selectCD1(OracleCommand cmd, Stocker context)
{
try
{
String sql = @" SELECT
A.TEST_CD1
A.TEST_CD2
A.TEST_CD3
FROM
TEST_TABLE1 A
WHERE
A.SAKUJO_FLG = :pSAKUJO_FLG

//Oracleパラメータ用のリストを宣言
List<OracleParameter> opArray = new List<OracleParameter>();

//未削除
opArray.Add(SetOracleParameter(":pSAKUJO_FLG", TestConstant.DEL_FLG_ZERO));

//SQLの実行、データセットへ格納
DataSet Ds = doSelect(cmd, sql, opArray);

return Ds;
}
catch (Exception ex)
{
}
}


selectCD2()のメソッド内で、以下のイメージでループを行い、
selectCD1()で取得した、"TEST_CD1"に紐づく"TEST_MEISHOU"を、
動的にDs2へ格納したいのですが、方法が不明です。
一度、Listに書き込んだ後、まとめてDs2に格納したいです。

※以下のメソッドはイメージです。

public DataSet selectCD2(OracleCommand cmd, Stocker context)
{
try
{
for(int i = 0; i< Ds.Tables[0].Rows.Count; i++)
{
String sql = @" SELECT
A.TEST_MEISHOU
FROM
TEST_TABLE2 A
WHERE
A.TEST_CD2 = :pTEST_CD1

//Oracleパラメータ用のリストを宣言
List<OracleParameter> opArray = new List<OracleParameter>();

//未削除
opArray.Add(SetOracleParameter(":pTEST_CD1", ※1);

//SQLの実行、データセットへ格納
DataSet Ds2 = doSelect(cmd, sql, opArray);
}
return Ds2;
}
catch (Exception ex)
{
}
}

※1
"TEST_CD1"を設定したい


大変申し訳ないのですが、アドバイス、参考になるサイトを
教えて頂けないでしょうか。
どうぞ、宜しくお願い致します。
■No28568に返信(talmanさんの記事)

削除フラグを指定し,TEST_TABLE1を取得し,TEST_TABLE2を取得する。ということで
すよね。

削除フラグがわかれば以下のようなSQLでTEST_TABLE2を取得することができるのでは
ないでしょうか。

SELECT
    T2.TEST_MEISHOU
FROM
    TEST_TABLE1 T1
    INNER JOIN TEST_TABLE2 T2
    ON T1.TEST_CD1 = T2.TEST_CD2
WHERE
    T1.SAKUJO_FLG = :pSAKUJO_FLG

取得したTEST_TABLE1のDataRowをループで処理したいということであれば,doSelect
メソッドに手を加えることになるのではないかと思います。

Listに書き込んだ後、まとめてDs2に格納というのがよくわかりませんでした。List
にはパラメータを追加するわけですよね。複数のDataRowのTEST_CD1を1つのListにま
とめてdoSelectメソッドに渡すということですか?
■No28569に返信(もりおさんの記事)
> ■No28568に返信(talmanさんの記事)
>
> 削除フラグを指定し,TEST_TABLE1を取得し,TEST_TABLE2を取得する。ということで
> すよね。
>
> 削除フラグがわかれば以下のようなSQLでTEST_TABLE2を取得することができるのでは
> ないでしょうか。
>
> SELECT
> T2.TEST_MEISHOU
> FROM
> TEST_TABLE1 T1
> INNER JOIN TEST_TABLE2 T2
> ON T1.TEST_CD1 = T2.TEST_CD2
> WHERE
> T1.SAKUJO_FLG = :pSAKUJO_FLG
>
> 取得したTEST_TABLE1のDataRowをループで処理したいということであれば,doSelect
> メソッドに手を加えることになるのではないかと思います。
>
> Listに書き込んだ後、まとめてDs2に格納というのがよくわかりませんでした。List
> にはパラメータを追加するわけですよね。複数のDataRowのTEST_CD1を1つのListにま
> とめてdoSelectメソッドに渡すということですか?


もりおさん、返信が遅くなり、申し訳御座いません。
ご回答ありがとうございます。

> 削除フラグがわかれば以下のようなSQLでTEST_TABLE2を取得することができるのでは
> ないでしょうか。
>
> SELECT
> T2.TEST_MEISHOU
> FROM
> TEST_TABLE1 T1
> INNER JOIN TEST_TABLE2 T2
> ON T1.TEST_CD1 = T2.TEST_CD2
> WHERE
> T1.SAKUJO_FLG = :pSAKUJO_FLG
申し訳御座いません。
上記のSQLは例なので、実際は他のSQLになります。


> 取得したTEST_TABLE1のDataRowをループで処理したいということであれば,doSelect
> メソッドに手を加えることになるのではないかと思います。

行いたいことは、まさに上記の通りです。

> Listに書き込んだ後、まとめてDs2に格納というのがよくわかりませんでした。List
> にはパラメータを追加するわけですよね。複数のDataRowのTEST_CD1を1つのListにま
> とめてdoSelectメソッドに渡すということですか?

申し訳御座いません。書き方が悪かったです。
ループしながら、Ds2に書き込むと、追加ではなく、上書きすると思っていたので、
一度Listに格納して、Ds2に一回だけ書き込めばうまくいくと思っておりました。
まとめてdoSelectメソッドに渡すのではなく、"TEST_CD1"のDataRow分ループして、doSelectを行い、Ds2にデータを格納したいです。

大変申し訳ないのですが、どうぞ、宜しくお願い致します。
■No28572に返信(talmanさんの記事)
パラメータオブジェクトの作成と接続の確立をループの外で行うようにするとよいと
思います。が、さて、selectCD2メソッドでループを行い、doSelectメソッドでOracl
eDataAdapterオブジェクトを作成するとパフォーマンスが悪くなり、OracleDataAdap
terオブジェクトを引数で渡すとdoSelectメソッドの役割がなくなってしまうような
気がします。doSelectメソッドの活用の仕方がわかりませんでした。

public DataSet selectCD2(OracleCommand cmd, Stocker context)
{

  String sql = @" SELECT
        A.TEST_MEISHOU
    FROM
        TEST_TABLE2 A
    WHERE
        A.TEST_CD2 = :pTEST_CD1";
  string connectionString = "connection string";
  DataSet ds = selectCD1(null, null);
  DataSet ds2 = new DataSet();
  OracleParameter pTEST_CD1 = new OracleParameter(":pTEST_CD1", OracleType.NChar);
  using (OracleDataAdapter adapter = new OracleDataAdapter(sql, connectionString))
  {
    adapter.SelectCommand.Parameters.Add(pTEST_CD1);
    try
    {
      adapter.SelectCommand.Connection.Open();
      foreach (DataRow row in ds.Tables[0].Rows)
      {
        pTEST_CD1.Value = row["TEST_CD1"];
        adapter.Fill(ds2);
      }
    }
    finally
    {
      adapter.SelectCommand.Connection.Close();
    }
  }
  return ds2;
}
■No28574に返信(もりおさんの記事)
> ■No28572に返信(talmanさんの記事)
> パラメータオブジェクトの作成と接続の確立をループの外で行うようにするとよいと
> 思います。が、さて、selectCD2メソッドでループを行い、doSelectメソッドでOracl
> eDataAdapterオブジェクトを作成するとパフォーマンスが悪くなり、OracleDataAdap
> terオブジェクトを引数で渡すとdoSelectメソッドの役割がなくなってしまうような
> 気がします。doSelectメソッドの活用の仕方がわかりませんでした。
>
> public DataSet selectCD2(OracleCommand cmd, Stocker context)
> {
>
> String sql = @" SELECT
> A.TEST_MEISHOU
> FROM
> TEST_TABLE2 A
> WHERE
> A.TEST_CD2 = :pTEST_CD1";
> string connectionString = "connection string";
> DataSet ds = selectCD1(null, null);
> DataSet ds2 = new DataSet();
> OracleParameter pTEST_CD1 = new OracleParameter(":pTEST_CD1", OracleType.NChar);
> using (OracleDataAdapter adapter = new OracleDataAdapter(sql, connectionString))
> {
> adapter.SelectCommand.Parameters.Add(pTEST_CD1);
> try
> {
> adapter.SelectCommand.Connection.Open();
> foreach (DataRow row in ds.Tables[0].Rows)
> {
> pTEST_CD1.Value = row["TEST_CD1"];
> adapter.Fill(ds2);
> }
> }
> finally
> {
> adapter.SelectCommand.Connection.Close();
> }
> }
> return ds2;
> }
>

もりおさん、お疲れ様です。
度々、ご回答ありがとう御座います。

上記のサンプルを参考にさせて頂き、再度コーディングを行いたいと思います。
作成が完了しましたら、フィードバックさせて頂きます。
また質問をお願いすることがあるかも知れませんが、どうぞ、宜しくお願い致します。

以上です。

DOBON.NET | プログラミング道 | プログラミング掲示板