If you work with typed datasets often enough, then chances are that at some point you're going to run across this error message:
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
The error message is logical enough - it tells you what's wrong. You have a dataset, and there's a piece of data which is violating it's constraints. If you have a small dataset, then you can usually spot where the problem lies quickly enough. However for larger datasets the offending table(s) and/or column(s) are usually harder to locate. If you don't feel like combing through your datasets with a fine comb, then here's a quick way to find out where your problem lies.
First, you're obviously going to need a general idea of which dataset is causing the problem, as well as an instance of that dataset being populated to use for your testing. Find a spot in your code where your offending dataset is being populated. Update your code so that you disable the constraints before population, ie:
someDataset.EnforceConstraints = false;
someDataset = MyAwesomeBusinessFacade.PopulateAwesomeDataset(awsesomeParameter);
Now, add the following method somewhere in your code:
private static void CheckDataSet(DataSet ds)
{
try
{
ds.EnforceConstraints = true;
}
catch (Exception ex)
{
DataRow[] rowsInError;
foreach (DataTable myTable in ds.Tables)
{
// Test if the table has errors. If not, skip it.
if (myTable.HasErrors)
{
// Get an array of all rows with errors.
rowsInError = myTable.GetErrors();
// Print the error of each column in each row.
for (int i = 0; i < rowsInError.Length; i++)
{
foreach (DataColumn myCol in myTable.Columns)
{
Debug.WriteLine(myCol.ColumnName + " " +
rowsInError[i].GetColumnError(myCol));
}
// Clear the row errors
rowsInError[i].ClearErrors();
}
}
}
}
}
Finally call the method and pass through your dataset:
someDataset.EnforceConstraints = false;
someDataset = MyAwesomeBusinessFacade.PopulateAwesomeDataset(awsesomeParameter);
CheckDataSet(someDataset);
In your Visual Studio debug output window you should have enough details to help you fix the problem. If not, then it's pretty easy to modify the CheckDataSet method in order to add more detail around wherever you percieve your problem to be.
This is one of those code snippets which is pretty basic, but gets filed under the category of "incredibly usefulful when you just need to find the problem, fix it, and move on in a hurry".
Tags:
ASP.NET, ADO.NET,
About me
My name is Ross Hawkins and I'm a developer, consultant, business owner and writer based in Auckland,
New Zealand (pictured below!). My current work revolves around ASP.NET, C#, jQuery, Ajax,
SQL Server, and a mix of other Microsoft development technologies.
I also have about 15 years of experience with IBM Lotus Notes/Domino and associated technologies. While Notes/Domino
is no longer my primary focus I still like to dabble and keep my skills up to date.
I own and run 2 businesses - Hawkins Consulting Services,
and Ignition Development.
Search
Popular Content
Troubleshooting WebResource.axd
The .NET 2.0 framework changed the way clientside JavaScript is
delivered to the browser. Previously, ASP.NET 1.1 used the
aspnet_client directory whereas now 2.0 uses WebResource.axd.
Published on October 8, 2006
jQuery Wildcard Selectors - some simple examples
I wrote about jQuery wildcard selector syntax briefly back in 2009, and since then that post has received a lot of views – way more than a post that brief should ever have seen..
Published on October 14, 2011
Microsoft AJAX Extensions: Sys.Debug is null or not an object
One of the breaking changes which was made with
the 1.0 release of the Microsoft Ajax Extensions was the renaming
of the 'Debug' class to 'Sys.Debug' for reasons of compatiability
with other frameworks. Breaking changes like this can often be a source of frustration..
Published on May 22, 2007
Simple ASP.NET Character Counter
A textbox character counter is a pretty simple piece of functionality, and there's a lot of different ways to apply one to your application. The following method is nice and simple, and can be done using only clientside JavaScript if required, or combined with server side code in order to create a more dynamic effect
Published on December 4, 2006
Adding Tooltips to Gridview Headers
As the title says, this is a very simple but dynamic way of achieving tooltip text on a header column. It's not overly flash, but it's lightweight and quick to implement.
Published on April 15, 2007
Archives
May, 2012 (1)
April, 2012 (4)
March, 2012 (2)
February, 2012 (4)
January, 2012 (3)
December, 2011 (3)
November, 2011 (8)
October, 2011 (9)
September, 2011 (8)
August, 2011 (5)
July, 2011 (4)
June, 2011 (7)
May, 2011 (5)
April, 2011 (3)
March, 2011 (8)
February, 2011 (4)
January, 2011 (3)
December, 2010 (8)
November, 2010 (5)
October, 2010 (6)
September, 2010 (7)
August, 2010 (11)
July, 2010 (12)
June, 2010 (8)
May, 2010 (8)
April, 2010 (4)
March, 2010 (8)
February, 2010 (6)
January, 2010 (12)
December, 2009 (13)
November, 2009 (11)
October, 2009 (12)
September, 2009 (12)
August, 2009 (2)
July, 2009 (7)
June, 2009 (12)
May, 2009 (9)
April, 2009 (9)
March, 2009 (9)
February, 2009 (8)
January, 2009 (7)
December, 2008 (6)
November, 2008 (7)
October, 2008 (9)
September, 2008 (12)
August, 2008 (9)
July, 2008 (6)
June, 2008 (24)
May, 2008 (13)
April, 2008 (16)
March, 2008 (8)
February, 2008 (10)
January, 2008 (1)
December, 2007 (14)
November, 2007 (11)
October, 2007 (11)
September, 2007 (13)
August, 2007 (11)
July, 2007 (5)
June, 2007 (15)
May, 2007 (11)
April, 2007 (9)
March, 2007 (9)
February, 2007 (10)
January, 2007 (8)
December, 2006 (18)
November, 2006 (11)
October, 2006 (14)
September, 2006 (9)
August, 2006 (10)
July, 2006 (4)
June, 2006 (4)
May, 2006 (6)
April, 2006 (3)
February, 2006 (6)
January, 2006 (10)
September, 2005 (2)
August, 2005 (4)
Post Categories
ASP.NET
AJAX
Amusing
NZ
NZ Trains
Notes/Domino
Visual Studio
Web Development
Miscellaneous
Me
Rugby
C#
SQL