- 題名: 【C#】DataSetの動的取得方法
- 日時: 2011/05/13 18:10:01
- ID: 28568
- この記事の返信元:
- (なし)
- この記事への返信:
- [28569] Re[1]: 【C#】DataSetの動的取得方法2011/05/14 7:44:45
- ツリーを表示
■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メソッドに渡すということですか?
■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; }
いつもお世話になっております。
質問をお願い致します。
以下のようなメソッドで、複数のレコードをもつ、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"を設定したい
大変申し訳ないのですが、アドバイス、参考になるサイトを
教えて頂けないでしょうか。
どうぞ、宜しくお願い致します。