суббота, 1 декабря 2007 г.

Суббота. Работа. Ужасное настроение.

Сегодня наткнулся на грабли с типизированными DataSet, на которые раньше очень часто наступал, но в последнее время этого удавалось избегать.

Видимо это связано с повышением профессионализма :)

Но сегодня как раз тот самый день. И я сижу и наблюдаю эту чертовски загадочное сообщение об ошибке:
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

Какой constraint, какое поле, какой not null, какой уникальный, какой внешний ключ?! ....

Неужели бравые ребята в MS не имели возможности это сделать? Они же умные, не то что я...

Помогите, поделитесь опытом. Какой методологией вы пользуетесь для выявления источника проблемы? :(

Stack trace целиком, если кому интересно:

System.Data.ConstraintException: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
at System.Data.DataSet.FailedEnableConstraints()
at System.Data.DataSet.EnableConstraints()
at System.Data.DataSet.set_EnforceConstraints(Boolean value)
at System.Data.DataTable.EndLoadData()
at System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

1 комментарий:

Mike Chaliy комментирует...

Не хочеш запитати це на dev.net.ua?
Я одразу відповім тобі щось на кшталт:
MethodInfo isConstraintViolatedMethod = typeof(Constraint).GetMethod(
"IsConstraintViolated", BindingFlags.Instance | BindingFlags.NonPublic
);

foreach (Constraint constraint in ds.DataTable1.Constraints)
{
bool isConstraintViolated = (bool)isConstraintViolatedMethod.Invoke(constraint, null);
if (isConstraintViolated == true)
{
Console.WriteLine("Failed: {0}", constraint);
}
}
І зрозуміло розповім що цей метод не дозволяє визначити якщо цей креш вийшов томущо десь null. Якщо всежтаки null, то потрібно просто зробити запит який покаже усі рядки зу null.

Хочу також запевнити, що я майже не користувався датасетами, а тому можуть бути інші шляхи, більш розумні ;).