- 題名: 【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"を設定したい
大変申し訳ないのですが、アドバイス、参考になるサイトを
教えて頂けないでしょうか。
どうぞ、宜しくお願い致します。