- gorisaku
- ベテラン
- 会議室デビュー日: 2004/04/17
- 投稿数: 95
|
投稿日時: 2005-08-30 19:41
VS.NET(C#)2003でプログラム開発をしています。
DataSetと外部ツールのGridコントロールを組み合わせで使用しているのですが、
行削除の際にDataSet上のレコードには削除マークがつくと思います。
その削除レコードの情報を取得する事が出来ないと思いますが、
どうにかして取得する方法はあるのでしょうか?
(同時に2つのDataSetにデータを挿入し、差を求める方法も考えましたが
効率的ではないかと・・・<出来るかどうかは試してませんが>)
(理由)
OracleDataBaseを使用しているのですが、更新処理はPL/SQLで行う予定です。
データ全件をBindするのではなく、
変更データ・削除データのみを処理する方法をとりたいのです。
ご回答お願いいたします。
|
- Jubei
- ぬし
- 会議室デビュー日: 2002/03/02
- 投稿数: 830
- お住まい・勤務地: 関西
|
投稿日時: 2005-08-30 21:15
諸農です。
DataSet.GetChanges(DataRowState)
ではいかがでしょうか?
_________________ 諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005
十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
|
- gorisaku
- ベテラン
- 会議室デビュー日: 2004/04/17
- 投稿数: 95
|
投稿日時: 2005-08-30 23:51
諸農殿 お久しぶりでございます。
以前からお助けいただきありがとうございます。
引用: |
|
DataSet.GetChanges(DataRowState)
ではいかがでしょうか?
|
早速試してみようと思います。
以前試した気もするのですが、削除レコードへのアクセスが
出来なかったような気がしております。
「削除された行を通して、その行の情報にアクセスすることはできません」
だったと思いますが・・・
もう一度試してみようと思います。
|
- Jubei
- ぬし
- 会議室デビュー日: 2002/03/02
- 投稿数: 830
- お住まい・勤務地: 関西
|
投稿日時: 2005-08-31 00:54
諸農です。
こんにちは。お元気でしたか。
引用: |
|
以前試した気もするのですが、削除レコードへのアクセスが
出来なかったような気がしております。
「削除された行を通して、その行の情報にアクセスすることはできません」
だったと思いますが・・・
|
削除行にアクセスするのはダメですね(^^;
コピーしてからリジェクトすればアクセスできますよ。
コピー元にも影響はないですし。
コード: |
|
DataTable t = new DataTable();
t.Columns.Add("COL1",typeof(string));
t.Columns.Add("COL2",typeof(DateTime));
t.Columns.Add("COL3",typeof(int));
for (int i = 0;i<30;i++)
{
DataRow r = t.NewRow();
r["COL1"] = "COL1-" + i.ToString();
r["COL2"] = DateTime.Now;
r["COL3"] = i;
t.Rows.Add(r);
}
t.AcceptChanges();
Console.WriteLine("after AcceptChanges t.Rows Count = {0}",t.Rows.Count);
for(int i = 4;i >= 0;i--) t.Rows[i].Delete();
Console.WriteLine("after RowsDelete t.Rows Count = {0}",t.Rows.Count);
DataTable del = t.GetChanges(DataRowState.Deleted);
Console.WriteLine("after GetChanges del.Rows Count = {0}",del.Rows.Count);
DataTable cpy = del.Copy();
Console.WriteLine("after TableCopy cpy.Rows Count = {0}",cpy.Rows.Count);
//コピーした削除データのフラグをクリアにする
cpy.RejectChanges();
Console.WriteLine("after RejectChanges cpy.Rows Count = {0}",cpy.Rows.Count);
//削除行のコピーを使って、削除行の内容を確認することが出来る
foreach(DataRow r in cpy.Rows) Console.WriteLine(r[0]);
//コピー元には影響がなかったかの確認
t.AcceptChanges();
Console.WriteLine("after RejectChanges t.Rows Count = {0}",t.Rows.Count);
|
_________________ 諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005
十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
|
- にしざき
- ぬし
- 会議室デビュー日: 2003/06/30
- 投稿数: 304
|
投稿日時: 2005-08-31 05:46
試していないのですが、DataRow のインデクサで第二引数を取るものを使用してもだめでしょうか。
|
- にしざき
- ぬし
- 会議室デビュー日: 2003/06/30
- 投稿数: 304
|
投稿日時: 2005-08-31 06:00
コード: |
|
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add();
dt.Columns.Add("a", typeof(string));
dt.Columns.Add("b", typeof(int));
dt.Columns.Add("c", typeof(string));
dt.Rows.Add(new object[]{"x", 1, "p"});
dt.Rows.Add(new object[]{"y", 2, "q"});
dt.Rows.Add(new object[]{"z", 3, "r"});
ds.AcceptChanges();
dt.Rows[1].Delete();
Debug.WriteLine(dt.Rows[1].RowState);
Debug.WriteLine((string)dt.Rows[1]["a", DataRowVersion.Original]);
|
こんなのを書いたら、きちんと値が取得できました。
|
- Jubei
- ぬし
- 会議室デビュー日: 2002/03/02
- 投稿数: 830
- お住まい・勤務地: 関西
|
投稿日時: 2005-08-31 06:43
諸農です。
引用: |
|
にしざきさんの書き込み (2005-08-31 06:00) より:
コード: |
|
Debug.WriteLine(dt.Rows[1].RowState);
Debug.WriteLine((string)dt.Rows[1]["a", DataRowVersion.Original]);
|
こんなのを書いたら、きちんと値が取得できました。
|
おおお、こっちの方がパフォーマンス良さそうですね。
知識が一つ増えました。
ありがとうございます。
_________________ 諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005
十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
|
- gorisaku
- ベテラン
- 会議室デビュー日: 2004/04/17
- 投稿数: 95
|
投稿日時: 2005-08-31 11:02
諸農殿、にしざき殿 お返事ありがとうございます。
お二人の情報を基に無事削除行に対するデータの取得が出来ました。
削除行のデータ取得をPL/SQLに使用できました。
ありがとうございました。
|