どの列と値が制約に違反しているかを調べるにはどうすればよいですか? 例外メッセージはまったく役に立ちません:
制約を有効にできませんでした。1 つ以上の行に、null 以外、一意、または外部キーの制約に違反する値が含まれています。
多くの人と同じように、私は独自の標準データアクセスコンポーネントを持っています。これには、DataSetを返すメソッドが含まれています。もちろん、ConstraintExceptionがスローされた場合、DataSetは呼び出し元に返されないため、呼び出し元は行エラーをチェックできません。
私が行ったことは、次の例のように、そのようなメソッドでConstraintExceptionをキャッチして再スローし、行エラーの詳細をログに記録することです(ログにLog4Netを使用します)。
...
try
{
adapter.Fill(dataTable); // or dataSet
}
catch (ConstraintException)
{
LogErrors(dataTable);
throw;
}
...
private static void LogErrors(DataSet dataSet)
{
foreach (DataTable dataTable in dataSet.Tables)
{
LogErrors(dataTable);
}
}
private static void LogErrors(DataTable dataTable)
{
if (!dataTable.HasErrors) return;
StringBuilder sb = new StringBuilder();
sb.AppendFormat(
CultureInfo.CurrentCulture,
"ConstraintException while filling {0}",
dataTable.TableName);
DataRow[] errorRows = dataTable.GetErrors();
for (int i = 0; (i < MAX_ERRORS_TO_LOG) && (i < errorRows.Length); i++)
{
sb.AppendLine();
sb.Append(errorRows[i].RowError);
}
_logger.Error(sb.ToString());
}
確認できる RowError というプロパティがあります。
http://dotnetdebug.net/2006/07/16/constraintexception-a-helpful-tip/を参照してください。
エラーがあった行を確認するための行の反復を示すこのリンクを追加するように編集されました。
http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic58812.aspx
厳密に型指定されたデータセットを使用し、ビジュアル デザイナー (xsd) を使用した場合: tbl.Rows[0].RowError情報にアクセスするには、 Fillメソッドを作成する必要があります。
DataTable は生成されたコード内でインスタンス化されるため、Get メソッドは使用できません。
ConstraintException の詳細を取得するためのスニペットが必要な Google 社員向け:
try
{
ds.EnforceConstraints = true;
}
catch (ConstraintException ex)
{
string details = string.Join("",
ds.Tables.Cast<DataTable>()
.Where(t => t.HasErrors)
.SelectMany(t => t.GetErrors())
.Take(50)
.Select(r => "\n - " + r.Table.TableName + "[" + string.Join(", ", r.Table.PrimaryKey.Select(c => r[c])) + "]: " + r.RowError));
throw new ConstraintException(ex.Message + details);
}
ここでConstraintException の発生をデバッグするのに役立つことがわかったコードをいくつか追加しました
お役に立てれば。