c# - cadena - informix client sdk
Error al habilitar restricciones. Una o más filas contienen valores que violan restricciones no nulas, únicas o de clave externa (21)
Realizo una combinación externa y la ejecuto con éxito en la base de datos de informix
pero obtengo la siguiente excepción en mi código:
DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);
Error al habilitar restricciones. Una o más filas contienen valores que violan restricciones no nulas, únicas o de clave foránea.
Conozco el problema, pero no sé cómo solucionarlo.
La segunda tabla en la que hago la combinación externa contiene una clave primaria compuesta que es nula en la consulta anterior de combinación externa.
EDITAR:
SELECT UNIQUE a.crs_e, a.crs_e || ''/ '' || a.crst crs_name, b.period,
b.crscls, c.crsday, c.from_lect, c.to_lect,
c.to_lect - c.from_lect + 1 Subtraction, c.lect_kind, e.eval, e.batch_no,
e.crsnum, e.lect_code, e.prof_course
FROM rlm1course a, rfc14crsgrp b, ckj1table c, mnltablelectev d,
OUTER(cc1assiscrseval e)
WHERE a.crsnum = b.crsnum
AND b.crsnum = c.crsnum
AND b.crscls = c.crscls
AND b.batch_no = c.batch_no
AND c.serial_key = d.serial_key
AND c.crsnum = e.crsnum
AND c.batch_no = e.batch_no
AND d.lect_code= e.lect_code
AND d.lect_code = ....
AND b.batch_no = ....
El problema ocurre con la tabla cc1assiscrseval
. La clave principal es (batch_no, crsnum, lect_code).
¿Cómo arreglar este problema?
EDITAR:
De acuerdo con el consejo de @PaulStock
: hago lo que él dijo y obtengo:
? dt.GetErrors () [0] {System.Data.DataRow} HasErrors: true ItemArray: {object [10]} RowError: "Columna ''eval'' no permite DBNull.Value."
Así que e.eval
mi problema reemplazando e.eval
por, NVL (e.eval,'''') eval
Y esto resuelve mi problema. Muchas gracias.
DirectCast (dt.Rows (0), DataRow) .RowError
Esto da directamente el error
El mío comenzó a funcionar cuando establecí AllowDBNull
en True en un campo de fecha en una tabla de datos en el archivo xsd.
El problema es con el diseñador de acceso a datos. En Visual Studio, cuando extraemos una vista de "Server Explorer" a la ventana de Designer, agrega una clave principal en una columna aleatoriamente o marca algo en un NOT NULL aunque en realidad está configurado como nulo. Aunque la creación de la Vista real en el servidor SQL db, no tiene definida ninguna clave primaria o NO se ha definido NULO, el diseñador de VS agrega esta Clave / restricción.
Puede ver esto en el diseñador: se muestra con un icono de llave a la izquierda del nombre de la columna.
Solución: haga clic con el botón derecho en el ícono de la tecla y seleccione "Eliminar clave". Esto deberia resolver el problema. También puede hacer clic con el botón derecho en una columna y seleccionar "Propiedades" para ver la lista de propiedades de una columna en el Diseñador de acceso a datos VS y cambiar los valores de manera apropiada.
En mi caso, este error fue provocado por el tamaño de una columna de cadena. Lo que era extraño fue cuando ejecuté exactamente la misma consulta en una herramienta diferente, los valores repetidos ni los valores nulos no estaban allí.
Luego descubrí que el tamaño de un tamaño de columna de cadena era 50, así que cuando llamé al método de relleno, se cortó el valor, arrojando esta excepción.
Hago clic en la columna y establezco las propiedades del tamaño en 200 y el error desapareció.
Espero que esto ayude
Este error también se muestra en mi proyecto. Intenté todas las soluciones propuestas publicadas aquí, pero no tuve suerte porque el problema no tenía nada que ver con el tamaño de los campos, la definición de los campos de la tabla clave, las restricciones o la variable del conjunto de datos EnforceConstraints.
En mi caso, también tengo un objeto .xsd que coloco allí durante el tiempo de diseño del proyecto (la capa de acceso a datos). A medida que arrastra sus objetos de tabla de base de datos al elemento visual Conjunto de datos, lee cada definición de tabla de la base de datos subyacente y copia las restricciones en el objeto Conjunto de datos exactamente como las definió cuando creó las tablas en su base de datos (SQL Server 2008 R2 en mi caso). Esto significa que cada columna de tabla creada con la restricción de "no nulo" o "clave externa" también debe estar presente en el resultado de su instrucción SQL o procedimiento almacenado.
Después de incluir todas las columnas clave y las columnas definidas como "no nulas" en mis consultas, el problema desapareció por completo.
Este problema generalmente es causado por uno de los siguientes
- valores nulos que se devuelven para las columnas no configuradas en AllowDBNull
- las filas duplicadas se devuelven con la misma clave principal.
- una falta de coincidencia en la definición de la columna (por ejemplo, tamaño de los campos de caracteres) entre la base de datos y el conjunto de datos
Intenta ejecutar tu consulta de forma nativa y mira los resultados, si el conjunto de resultados no es demasiado grande. Si eliminó los valores nulos, supongo que las columnas de la clave principal se están duplicando.
O bien, para ver el error exacto, puede agregar manualmente un bloque Try / Catch al código generado como tal y luego interrumpir cuando se presente la excepción:
Luego, dentro de la ventana de comandos, llame GetErrors
método GetErrors
en la tabla para obtener el error.
Para C #, ¿el comando sería ? dataTable.GetErrors()
? dataTable.GetErrors()
Para VB, ¿el comando es ? dataTable.GetErrors
? dataTable.GetErrors
Esto le mostrará todas las líneas de datos que tienen un error. Puede ver el RowError
para cada uno de estos, que le indicará la columna que no es válida junto con el problema. Entonces, para ver el error del primer Datarow en error, el comando es:
? dataTable.GetErrors(0).RowError
o en C # sería ? dataTable.GetErrors()[0].RowError
? dataTable.GetErrors()[0].RowError
Esto encontrará todas las filas en la tabla que tienen errores, imprime la clave primaria de la fila y el error que ocurrió en esa fila ...
Esto está en C #, pero convertirlo a VB no debería ser difícil.
foreach (DataRow dr in dataTable)
{
if (dr.HasErrors)
{
Debug.Write("Row ");
foreach (DataColumn dc in dataTable.PKColumns)
Debug.Write(dc.ColumnName + ": ''" + dr.ItemArray[dc.Ordinal] + "'', ");
Debug.WriteLine(" has error: " + dr.RowError);
}
}
Vaya, lo siento PKColumns es algo que agregué cuando extendí DataTable que me dice todas las columnas que componen la clave principal de DataTable. Si conoce las columnas de Clave principal en su tabla de datos, puede recorrerlas aquí. En mi caso, dado que todas mis tablas de datos conocen sus cols PK, puedo escribir errores para estos errores automáticamente para todas las tablas.
La salida se ve así:
Row FIRST_NAME: ''HOMER'', LAST_NAME: ''SIMPSON'', MIDDLE_NAME: ''J'', has error: Column ''HAIR_COLOR'' does not allow DBNull.Value.
Esto funcionó para mí, fuente: here
Tuve este error y no estaba relacionado con las restricciones de DB (al menos en mi caso). Tengo un archivo .xsd con una consulta GetRecord que devuelve un grupo de registros. Una de las columnas de esa tabla era "nvarchar (512)" y en el medio del proyecto necesité cambiarla a "nvarchar (MAX)".
Todo funcionó bien hasta que el usuario ingresó más de 512 en ese campo y comenzamos a obtener el famoso mensaje de error "Error al habilitar restricciones. Una o más filas contienen valores que violan restricciones no nulas, únicas o de clave foránea".
Solución: compruebe toda la propiedad MaxLength de las columnas en su DataTable.
La columna que cambié de "nvarchar (512)" a "nvarchar (MAX)" aún tenía el valor 512 en la propiedad MaxLength, así que cambié a "-1" y funciona !!.
Gracias por todos los aportes realizados hasta ahora. Solo quiero agregar que si bien uno puede haber normalizado DB exitosamente, actualizado cualquier cambio de esquema a su aplicación (por ejemplo, al conjunto de datos), también hay otra causa: Producto CARTESIANO sql (al unir tablas en consultas).
La existencia de un resultado de consulta cartesiano causará registros duplicados en la tabla primaria (o clave primero) de dos o más tablas que se unen. Incluso si especifica una cláusula "Where" en el SQL, aún puede producirse un cartesiano si JOIN con la tabla secundaria, por ejemplo, contiene la combinación desigual (útil cuando se obtienen datos de 2 o más tablas sin relación):
DESDE tbPrimera UNIÓN INTERNA tbSystem ON tbFirst.reference_str <> tbSystem.systemKey_str
Solución para esto: las tablas deben estar relacionadas.
Gracias. Chabert
No está claro por qué ejecutar una instrucción SELECT debería implicar habilitar restricciones. No sé C # o tecnologías relacionadas, pero sí sé la base de datos de Informix. Hay algo extraño que sucede con el sistema si su código de consulta está habilitando (y presumiblemente también deshabilitando) las restricciones.
También debe evitar la notación de unión Informix OUTER anticuada y no estándar. A menos que esté utilizando una versión imposiblemente antigua de Informix, debe usar el estilo de combinaciones de SQL-92.
Su pregunta parece mencionar dos uniones externas, pero solo muestra una en la consulta de ejemplo. Eso, también, es un poco desconcertante.
Las condiciones de unión entre '' e
'' y el resto de las tablas son:
AND c.crsnum = e.crsnum
AND c.batch_no = e.batch_no
AND d.lect_code= e.lect_code
Esta es una combinación inusual. Como no tenemos el subconjunto relevante del esquema con las restricciones de integridad referencial relevantes, es difícil saber si esto es correcto o no, pero es un poco inusual unir 3 tablas de esa manera.
Nada de esto es una respuesta definitiva a tu problema; sin embargo, puede proporcionar alguna orientación.
Para solucionar este error, quité el preocupante adaptador de tabla del diseñador de Dataset, y guardé el conjunto de datos, y luego arrastré una copia nueva del adaptador de tabla desde el explorador del servidor y lo arreglé
Parece que posiblemente una o más de las columnas se seleccionen con:
e.eval, e.batch_no, e.crsnum, e.lect_code, e.prof_course
tiene AllowDBNull establecido en False en la definición de su conjunto de datos.
Puede desactivar las restricciones en el conjunto de datos. Le permitirá identificar datos incorrectos y ayudar a resolver el problema.
p.ej
dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");
El método de relleno puede ser ligeramente diferente para ti.
Resolví el mismo problema cambiando esto de falso a verdadero. al final fui a la base de datos y cambié mi campo de bits para permitir null, y luego actualicé mi xsd, y actualicé mi wsdl y reference.cs y ahora todo está bien.
this.columnAttachPDFToEmailFlag.AllowDBNull = true;
Resolví este problema abriendo el archivo .xsd con un lector XML y eliminando una restricción colocada en una de mis vistas. Por alguna razón, cuando agregué la vista a los datos, agregó una restricción de clave primaria a una de las columnas cuando no debería haber una.
La otra forma es abrir el archivo .xsd normalmente, mirar la tabla / vista que causa el problema y eliminar cualquier clave (clic derecho en la columna, seleccionar delete key
) que no debería estar allí.
Resolví este problema haciendo la "subselección" como esta:
string newQuery = "select * from (" + query + ") as temp";
Cuando lo haga en mysql, todas las propiedades de collunms (únicas, no nulas ...) se borrarán.
Si está usando el diseñador visual dataset designer para obtener la tabla de datos, y está lanzando un error ''Failed to Enable constraints''. Me enfrenté al mismo problema, intenté obtener una vista previa de los datos del diseñador del conjunto de datos y compararlo con la tabla dentro de su base de datos.
La mejor forma de resolver este problema es eliminar el adaptador de tabla y crear uno nuevo.
Solo quiero agregar otro motivo posible para la excepción a los enumerados anteriormente (especialmente para las personas a las que les gusta definir manualmente el esquema del conjunto de datos):
cuando en su conjunto de datos tiene dos tablas y hay una relación ( DataSet.Reletions.Add()
) definida desde el campo de la primera tabla ( chfield
) al campo de la segunda tabla ( pfield
), hay una restricción implícita que se agrega a ese campo ser único aunque no se especifique explícitamente como tal en su definición ni como único ni como clave principal.
Como consecuencia, si tiene filas con valores repetitivos en ese campo principal ( pfield
) obtendrá también esta excepción.
También tuve este problema y se resolvió después de modificar el * .xsd para reflejar el tamaño revisado de la columna modificada en el servidor SQL subyacente.
* Manera secundaria: *
Si no necesita [id] para estar como clave principal,
Elimine su atributo de clave principal:
en su DataSet> TableAdapter> haga clic derecho en la columna [id]> seleccione la tecla Eliminar ...
El problema será solucionado.
Asegúrese de que los campos nombrados en la consulta del adaptador de tabla coinciden con los de la consulta que ha definido. Al DAL no parece gustarle los desajustes. Esto sucederá normalmente con sus sprocs y consultas después de agregar un nuevo campo a una tabla.
Si ha cambiado la longitud de un campo varchar en la base de datos y el XML contenido en el archivo XSS no lo ha recogido, busque el nombre del campo y la definición del atributo en el XML y cámbielo manualmente.
Quite las claves primarias de las listas de selección en los adaptadores de tablas si no están relacionadas con los datos que se devuelven.
Ejecute su consulta en SQL Management Studio y asegúrese de que no se devuelvan registros duplicados. Los registros duplicados pueden generar claves primarias duplicadas que causarán este error.
Los sindicatos SQL pueden significar problemas. Modifiqué un adaptador de mesa agregando un registro ''seleccione un empleado'' que precede a los demás. Para los otros campos proporcioné datos ficticios, incluyendo, por ejemplo, cadenas de longitud uno. El DAL dedujo el esquema de ese registro inicial. Los registros siguientes con cadenas de longitud 12 fallaron.