Este error ya ha aparecido en dos de mis proyectos.
Tenía un Datalist (o Gridview) que estaba ligado a un ObjectDatasource, el cual se alimentaba de un Business Layer que a su vez tomaba los datos de un archivo XSD.
Estuve peléandome con todos estos objetos, checando sus propiedades, borrándolos y volviéndolos a crear, y nada funcionó.
En las dos ocasiones que se me presentó esta situación, resulta que el problema estaba en los datos!
En ambas ocasiones estaba convirtiendo la aplicación de ASP.NET 1 a ASP.NET 2, por lo que ya contaba con la base de datos y ésta ya tenia información real.
Así es que si no encuentras el problema en la lógica, checa también los datos. En uno de los casos pasaba que había un campo de fecha, el cual tenía muchos registros que tenían la fecha establecida en “0000-00-00″, es decir, no la habían capturado porque era un campo que quedó en desuso y no tuve la precisión de eliminarlo o llenarlo con una fecha válida.
El caso es que cuando la aplicación trataba de llenar el DataList, se encontraba con esa fecha inválida y regresaba el error:
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
Mi solución: llené todos esos campos con fechas válidas y funcionó.
Repito, pasa muchas veces, si no encuentras el error en tu lógica, siempre revisa la validez de los datos en la base de datos.
Actualización
Me volvió a suceder el mismo error, y encontré una razón más contundente.
Resulta que mi sentencia SQL hacía un join de tres tablas. Estaba intentando colocar esa sentencia en un TableAdapter que había creado para una de las tablas:
El TableAdapter mostrado arriba contiene la definición de una tabla, es por eso que se pueden leer los campos id, idPostal, idusuario, etc.
Al ejecutar el join se mostraba el error descrito en la primera parte de este post.
Para solucionar esta situación tuve que pasar la sentencia que contenía el join a un nuevo TableAdapter, como se muestra a continuación:
Listo, como puedes ver el TableAdapter creado ya no contiene toda la definición de las columnas. Le cree una clase BusinessLogic la cual uso en mi código y ya no marca esos problemas.
Segunda Actualización
En otros casos puede ser la propiedad MaxLength. Por ejemplo, si en tu TableAdapter tienes esa propiedad establecida en un valor distinto al que aparece para ese mismo campo en las sentencias Insert o Update, también ocurre este error. Todos los MaxLength para el mismo campo deben ser iguales para todas las sentencias y para las propiedades mismas del adaptador.


Agosto 12th, 2007 at 10:02
hola!
He tenido este mismo error, he seguido tu ejemplo de pasar el método a un nuevo Table Adapter y crearle un nuevo Bussiness Logic, pero… ahora quiero mostrar en un datagrid mis datos y utilizo como ObjectSource ese nuevo BusinessLogic creado pero… no me muestra nada :S
Agosto 13th, 2007 at 10:44
Quizás tu instrucción SQL no está jalando los datos correctos?
Intenta copiar tu instrucción SQL al cliente que usas para crear las tablas y fíjate si está trayendo información. Si no, el error está en tu instrucción.
Diciembre 6th, 2007 at 17:45
Lo que puedes intentar hacer tambien en un caso de estos es modificar la columna en el tableadapter, ahi le dices allowdbnull = true con eso tambien te funciona, porque el error puede estar originado por muchas cosas y una de las que despliega ese error es esa.
Saludos
Marzo 5th, 2008 at 0:39
Que buena respuesta hermano si cuando estamos comenzamos creemos que cuando hacemos el cambio en la base de datos se va a hacer en el dataset tambien pero ya me di cuenta que no es asi solo le fui a cambia el maxleng del campo y lo puse como en la bd y todo funciono bien.
Marzo 7th, 2008 at 16:05
Primeramente dejame decirte que las repuestas estan muy buenas y ayudan mucho…bueno he rebicida todo lo que has escrito y tengo el mismo problema solo me falta intentar lo del nuevo tableadapter y pasar la sentencia esa parte no se como crear otro tableadapter tal vez si me detalles mas este procedimiento por favor gracias….
Junio 22nd, 2008 at 20:56
Yo he tenido el mismo problema, mi solucion: agregar una columna id en la consulta de stored procedure. El problema tambien se debe en que en algunos casos el conjunto de resultados posee registros duplicados. Entonces agregando una columna adicional que haga de primary key resuelve el problema.
Junio 26th, 2008 at 14:06
Necesito ayuda ya!
select campo1, campo2 from tabal WHERE CONTAINS(campo1, ‘ “frase” ‘)
No me muestra nada. Por qué?