- PR -

DataSetから削除レコード情報を取得するには?

1
投稿者投稿内容
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に使用できました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)