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

DataSet 被参照行の削除

環境/言語:[Windows2000 VS.NET2003 C#]
分類:[.NET]

2005/05/29(Sun) 12:45:30 編集(投稿者)
2005/05/29(Sun) 12:42:57 編集(投稿者)
2005/05/29(Sun) 12:40:23 編集(投稿者)
2005/05/28(Sat) 15:17:46 編集(投稿者)
2005/05/28(Sat) 13:37:36 編集(投稿者)

お世話になっております。
データセットにてTableA,TableBを追加して
TableBの外部キーとTableAの主キーが関連しています。

TableA.ID ← TableB.RefA_ID

ここでサンプル行をTableA、TableBに追加し、
TableAの行をDataGridから[Deleteボタン]で削除しようとしたところ
例外が発生して、アプリが落ちてしまいます。

例外:
制約がリレーションシップConstraint1で適用され、
この行を削除すると子行が孤立するため、この行を削除できません。

この例外は意図した通りですが、落ちるのが回避できません。
main()関数で止まるのでどこで落ちているのかはよくわかりません。
また、Rule.SetNullなどではなく、被参照行を削除できないようにしたいです。
どうすればよろしいでしょうか。よろしくお願いいたします。
(DataRelationを使って同じことをやっても同じ結果でした。)


以下がコードです。
Windowsアプリケーション(自動生成コード以外で自分が書いたのはこれだけです。)
-------------------------------------------------------
DataSet ds = new DataSet();
dataGrid1.DataSource = ds;

// Table A--------------------------------------------------------------
ds.Tables.Add( "TableA" );

// 主キー作成
DataColumn[] dcPrimaryKey = new DataColumn[ 1 ];
dcPrimaryKey[ 0 ] = ds.Tables[ "TableA" ].Columns.Add( "ID", typeof( int ) );
ds.Tables[ "TableA" ].PrimaryKey = dcPrimaryKey;

//サンプル行追加
DataRow row = ds.Tables[ "TableA" ].NewRow();
row[ "ID" ] = 1;
ds.Tables[ "TableA" ].Rows.Add( row );

// Table B--------------------------------------------------------------
ds.Tables.Add( "TableB" );
ds.Tables[ "TableB" ].Columns.Add( "RefA_ID", typeof( int ) );

// 外部キー作成
ForeignKeyConstraint fkc = new ForeignKeyConstraint(
ds.Tables[ "TableA" ].Columns[ "ID" ],
ds.Tables[ "TableB" ].Columns[ "RefA_ID" ] );

//制約の追加
fkc.DeleteRule = Rule.None;
ds.Tables[ "TableB" ].Constraints.Add( fkc );

//サンプル行追加
row = ds.Tables[ "TableB" ].NewRow();
row[ "RefA_ID" ] = 1;
ds.Tables[ "TableB" ].Rows.Add( row );
> この例外は意図した通りですが、落ちるのが回避できません。
> また、Rule.SetNullなどではなく、被参照行を削除できないようにしたいです。

 興味があったので調べてみました。次のやり取りが参考になるかと思います。

Datagrid/datatable constraint problem
http://www.dotnet247.com/247reference/msgs/11/58459.aspx
2005/05/31(Tue) 14:33:46 編集(投稿者)
2005/05/31(Tue) 14:33:43 編集(投稿者)

わざわざ調べていただき、本当にありがとうございました。
以下の通り解決しました。
感謝いたします。


public class Form1 : System.Windows.Forms.Form
{
static void Main()
{
CustomExceptionHandler eh = new CustomExceptionHandler();
Application.ThreadException += new ThreadExceptionEventHandler( eh.OnThreadException );
Application.Run(new Form1());
}
}

internal class CustomExceptionHandler
{
public void OnThreadException ( object sender, ThreadExceptionEventArgs t )
{
string szErrorMsg = "Error : " + t.Exception.Message;
MessageBox.Show( szErrorMsg, "Title" );
}
}
解決済み!

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