Abstract: Sometimes during work with DataAdapter, you get an exception with a very broad message: “Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.” We will explain how to get more detailed, specific information about this.
Problem
During work on one application that was using C# ADO.NET DataAdapter technology to access SQL Server database, I started to get an exception with a very broad message: “Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.” Using Exception StackTrace, it was easy to locate the source of that exception.
It was the DataAdapter call to FillByFilename() method. But, problem was that message was broad, and I didn’t see which of the constraints is failing. So, I needed more information. Unfortunately, the library creators failed to provide more info in the exception itself, so I needed to do some more debugging.
Solution
Locate method itself
The first step is to locate the source code (in the designer’s auto-generated file) of that method.
Enable debugging for generated code
In Visual Studio options, disable debugging of just your code.
Add try-catch into generated code
Add try-catch code and call to GetErrors() method to auto-generated DataAdapter code. Set a breakpoint on the catch statement.
Debug and see Errors info
Start your debugging session and check in the debugger for the results of the GetErrors() method. You will see exactly which constraint failed.
Revert generated code to normal state
Do not forget to revert your auto-generated code to a normal state, because you are now suppressing exceptions with your catch statement. Just change something in the Designer, and DataAdapter code will be auto-generated again and your debugging changes will be overwritten.