DeletedRowInaccessibleException
Design.TypedDataSetGeneratorException
DuplicateNameException
EntityException
InRowChangingEventException
InvalidCommandTreeException
InvalidConstraintException
InvalidExpressionException
MissingPrimaryKeyException
NoNullAllowedException
ObjectNotFoundException
ReadOnlyException
RowNotInTableException
StrongTypingException
TypedDataSetGeneratorException
UpdateException
VersionNotFoundException
ConstraintException
「
制約を有効にできませんでした。行に入力できるのは、Null 以外の値、一意な値、あるいは外部キーですが、この制約の違反が 1 つ以上の行で発生しています。
」
DataSet.EnforceConstraintsをfalseとすることで、制約を一時的に無効にできます。
Remarks - ConstraintException Class (System.Data) | Microsoft Learn
値は既に存在する
「
列 '
***
' は一意であるように制約されています。値 '
***
' は既に存在します。
」
DataTable table = new DataTable();
DataColumn column = table.Columns.Add();
column.Unique = true;
table.Rows.Add("A");
table.Rows.Add("A");
InvalidConstraintException Class (System.Data) | Microsoft Learn
親テーブルに存在している子キーが必要
「
ForeignKeyConstraint
ConstraintName
には親テーブルに存在している子キー値 (
***
) が必要です。
」
DataSet dataSet = new DataSet();
DataTable tableA = dataSet.Tables.Add();
DataTable tableB = dataSet.Tables.Add();
DataColumn columnA = tableA.Columns.Add();
DataColumn columnB = tableB.Columns.Add();
DataRelation relation = dataSet.Relations.Add(columnA, columnB);
tableA.Rows.Add("1");
tableB.Rows.Add("1");
tableB.Rows.Add("2");
子行が孤立する
「
制約がリレーションシップ
Relation
で適用され、この値を変更すると子行が孤立するため、変更できません。
(Cannot make this change because constraints are enforced on relation
Relation
, and changing this value will strand child rows.)」
DuplicateNameException
既に属している
「
'
ColumnName
' という列は既にこの DataTable に属しています。(A column named '
ColumnName
' already belongs to this DataTable.)
」
この例外の直前に、「
同一のキーを含む項目が既に追加されています。(An item with the same key has already been added.)
」としてArgumentExceptionも投げられます。
table.Columns.Add("col");
table.Columns.Add("col");
この例外はDelete()またはDataRowCollection.
Remove
()で行が削除されているときに、以下のメソッドが呼ばれたときに投げられます。
Remarks - RowNotInTableException Class (System.Data) | Microsoft Learn
DataRow.AcceptChanges()
DataRow.RejectChanges()
DataRow.
GetChildRows
()
DataRow.SetParentRow()
DataRow.GetParentRow()
DataRow.GetParentRows()
テーブルにない行で操作を実行できない
「
テーブルにない行でこの操作を実行することはできません。
」
DataTable table = new DataTable();
DataRow row = table.Rows.Add();
row.Delete();
row.
AcceptChanges
();
row.
RejectChanges
();
削除していなくても、テーブルに追加しておらず
RowState
がDetachedならば発生します。
DataTable table = new DataTable();
DataRow row = table.NewRow();
row.AcceptChanges();
テーブルから削除されている
「
この行はテーブルから削除されており、データは含まれていません。BeginEdit() を使うとこの行に新しいデータを作成することができます。
」
DataSet dataSet = new DataSet();
DataTable tableA = dataSet.Tables.Add();
DataTable tableB = dataSet.Tables.Add();
DataColumn columnA = tableA.Columns.Add();
DataColumn columnB = tableB.Columns.Add();
DataRelation relation = dataSet.Relations.Add(columnA, columnB);
DataRow rowA = tableA.Rows.Add("1");
DataRow rowB = tableB.Rows.Add("1");
rowA.Delete();
DataRowState state = rowB.RowState;
DataRow[] rowsA = rowA.
GetChildRows
(relation);
rowB.
SetParentRow
(rowA);
DataRow r1 = rowB.
GetParentRow
(relation);
DataRow[] r2 = rowB.
GetParentRows
(relation);
Delete()などで行が削除されていても、その
RowState
がDeletedならば、RowNotInTableExceptionではなくDeletedRowInaccessibleExceptionが投げられます。
rowB.AcceptChanges();
rowB.Delete();
rowA.AcceptChanges();
rowA.Delete();
DataRow[] rowsA = rowA.GetChildRows(relation);
rowB.SetParentRow(rowA);
DataRow r1 = rowB.GetParentRow(relation);
DataRow[] r2 = rowB.GetParentRows(relation);
なお同様にRowStateがDeletedのときにAcceptChanges()を呼ぶと、それが確定されてDetachedになるため例外は投げられません。
DataTable table = new DataTable();
DataRow row = table.Rows.Add();
row.AcceptChanges();
row.Delete();
row.AcceptChanges();
DataRow.Item[]、DataRow.ItemArray
DataRow.Item[]やDataRow.ItemArrayから読み込むとき、RowStateがDetachedのときはRowNotInTableExceptionが投げられます。
DataTable table = new DataTable();
table.Columns.Add();
DataRow row = table.Rows.Add();
row.Delete();
object data1 = row[0];
object[] items1 = row.ItemArray;
row[0] = 1;
object data2 = row[0];
object[] items2 = row.ItemArray;
Field<T>()やSetField<T>()も内部ではDataRow.Item[]へアクセスしているため、同様に例外が発生します。
object data1 = row.Field<object>(0);
row.SetField(0, 1);
object data2 = row.Field<object>(0);
この例外は、内部での列のインデックスを取得するためのGetDefaultRecord()から投げられます。
this - DataRow.cs
IndexOutOfRangeException
コレクションに含まれていない行を削除しようとした場合などは、DataExceptionから派生していない例外が投げられます。
Remove - DataRowCollection.cs
DataTable table = new DataTable();
table.Columns.Add();
DataRow row = table.Rows.Add(1);
table.Rows.Remove(row);
table.Rows.
Remove
(row);
この例外は削除されている行の値を、以下のプロパティやメソッドで取得や設定しようとするときに投げられます。
Remarks - DeletedRowInaccessibleException Class (System.Data) | Microsoft Learn
DataRow.Item[]
DataRow.ItemArray
DataRow.BeginEdit()
削除された行を通してアクセスできない
「
削除された行を通して、その行の情報にアクセスすることはできません。
」
DataTable table = new DataTable();
table.Columns.Add();
DataRow row = table.Rows.Add();
row.AcceptChanges();
row.Delete();
row
[
0
]
= 1;
object data1 = row
[
0
]
;
row.AcceptChanges();
row.RowError = "a";
string error = row.RowError;
RowStateがDeletedならば、DataRow.
GetChildRows
()などでもこの例外が投げられます。
削除されたDataRowのバージョンを得ようとするときに投げられます。
アクセスするデータがない
DataTable table = new DataTable();
table.Columns.Add();
DataRow row = table.Rows.Add();
object obj1 = row[0, DataRowVersion.Current];
object obj2 = row[0, DataRowVersion.Original];
object obj3 = row[0, DataRowVersion.Proposed];
DataException Class (System.Data) | Microsoft Learn