Pregunta

Estoy usando VS2008 C # Express y la base de datos Northwind en una aplicación de Windows Form.

Utilicé arrastrar y soltar para configurar el enlace de detalles maestros (utilicé los pedidos y los detalles del pedido) para las dos vistas de cuadrícula de datos. En este punto, todo funciona como se esperaba. Para no devolver todas las filas de la tabla, quiero filtrar la tabla de pedidos en función de un filtro para la tabla de pedidos Y también en un campo en la tabla Detalles de pedidos. En el Asistente de configuración de TableAdapter, utilicé el generador de consultas para agregar un nuevo FillByMyFilter que creó la siguiente consulta:

SELECCIONAR pedidos. [ID de pedido], pedidos. [ID de cliente], pedidos. [ID de empleado], pedidos. [Nombre de envío], pedidos. [Dirección de envío], pedidos. [Ciudad de envío], pedidos. [Enviar Región],                       Pedidos. [Código postal de envío], Pedidos. [País de envío], Pedidos. [Envío por vía], Pedidos. [Fecha de pedido], Pedidos. [Fecha requerida], Pedidos. [Fecha de envío],                       Pedidos. DE ÓRDENES INTERIORES ÚNASE                       [Detalles del pedido] ON pedidos. [ID del pedido] = [Detalles del pedido]. [ID del pedido] DONDE (Pedidos. [Nombre del envío] COMO N'A% ') Y ([Detalles del pedido] .Cantidad & Lt; 20)

Obtuve esto agregando ambas tablas, pero no marqué ninguno de los cuadros de campo en la tabla Detalles del pedido para que solo devolviera las columnas que se usaron en la consulta de relleno original. Solo estoy tratando de filtrar el DataSet en la tabla maestra en este momento y no devolver un número diferente de columnas. Las filas secundarias de los Detalles del pedido aún deberían funcionar como el conjunto de resultados sin filtro predeterminado.

Ahora el problema: cuando hago clic en el botón Ejecutar consulta, funciona bien. Obtengo 53 filas de la consulta anterior en lugar del 1078 usando el relleno predeterminado creado por el diseñador. Devuelve las mismas columnas que la consulta de relleno original. Sin embargo, cuando intento ejecutar la aplicación, aparece el siguiente error de restricción:

" Error al habilitar restricciones. Una o más filas contienen valores que violan restricciones no nulas, únicas o de clave externa. & Quot;

¿Qué estoy haciendo mal?

ACTUALIZACIÓN: Creo que obtengo el error de restricción debido a la UNIÓN INTERNA creada por el Asistente. Si edito la consulta para usar LEFT JOIN, el asistente la cambia de nuevo a INNER JOIN.

Mi pregunta sigue siendo cómo filtrar registros en la tabla principal (pedidos) según los criterios de la tabla principal y secundaria. Mi próxima prueba es probar y usar un proceso almacenado, pero me gustaría saber usando solo el método FillBy personalizado de TableAdapter.

Saludos,

DeBug

¿Fue útil?

Solución 3

Gracias a todos los que publicaron una respuesta. Así es como lo hice usando el Asistente de TableAdapter y el conjunto de datos escrito Northwind.

1) Haga clic derecho en la tabla principal en el diseñador xsd para agregar o configurar la consulta. 2) Haga clic en & Quot; Siguiente & Quot; abotone en el asistente hasta que vea " Query Builder " botón. Haga clic en el botón Generador de consultas para entrar en el modo generador de consultas. 3) Haga clic derecho y agregue la tabla secundaria en el panel de diseño. Debe tener ambas tablas y la restricción predeterminada que las conecta. 4) Haga clic en la columna de la tabla secundaria que desea filtrar (esta marca de verificación se eliminará más adelante) para agregarla al panel de criterios para que pueda filtrarla. 5) Agregue el filtro para las columnas padre e hijo. En este ejemplo, filtré el Nombre del barco COMO 'A%' y la Cantidad de pedido & Lt; 20.

Tenga en cuenta que en este punto puede probar su consulta haciendo clic en el botón Ejecutar consulta. Al usar Northwind DB para la edición compacta de SQL 2008 obtengo 53 filas devueltas. Si tuviera que guardarlo en este punto, fallaría en tiempo de ejecución debido a las claves primarias duplicadas en el conjunto de resultados. Entonces, los próximos pasos los eliminarán.

6) En el panel de criterios, desmarque la columna de la tabla secundaria que agregó anteriormente. El filtro permanecerá y la misma columna ahora estará desmarcada en el panel de diseño también. Si ejecuta la consulta, todavía tendrá 53 filas pero sin la columna de la tabla secundaria. 7) Haga clic derecho en el panel de diseño y agregue & Quot; Agrupar por & Quot ;. En este punto, cuando ejecuta esta consulta, no debe tener duplicados en la ID de la orden. Tengo exactamente 29 filas devueltas. 8) Haga clic en Aceptar y luego en & Quot; Siguiente & Quot; botón hasta que guarde su nueva consulta FillBy. 9) Cambie su código fuente para usar su nuevo FillBy.

Cuando ejecuté la aplicación, obtuve la tabla principal filtrada con las mismas 29 filas que devolvió el botón Ejecutar consulta. La tabla secundaria funcionó como se esperaba y contenía al menos una fila secundaria que contenía una cantidad de & Lt; 20.

Para una aplicación del mundo real, creo que sería mejor usar un proceso almacenado o LINQ. Pero este problema me hizo rascarme la cabeza y entonces & "; Lo hice encajar &"; solo porque fue un desafío (al menos para mí).

Otros consejos

Este artículo contiene algunas sugerencias de solución de problemas para identificar la fila exacta que causa el problema:

DataSet hell - " Error al habilitar restricciones. Una o más filas contienen valores .... & Quot;

Si busca en el archivo Orders.Designer.cs (adivinando, ya que estoy trabajando en VB), es probable que vea una restricción única definida en los pedidos (para la clave principal).

Sospecho que el problema es que, cuando ejecuta su consulta, obtiene una o más órdenes individuales que tienen > 1 OrderDetails.Quanity & Gt; 20 .... entonces, ese Pedido será devuelto dos veces en su conjunto de resultados, violando la clave principal.

Prueba: SELECCIONE * de los pedidos donde [Nombre del envío] LIKE '% whatever% AND OrderID in (seleccione OrderID de OrderDetails donde Cantidad & Lt; 20)

Esta es probablemente una forma muy ineficiente de hacerlo, en Oracle usaría EXISTS () en lugar de IN () pero no sé el equivalente del servidor SQL.

Espero que hayas respondido esto, pero si no, piensa en esto.

En su conjunto de datos, si las tablas de datos Order y OrderDetail tienen una relación entre ellas, entonces funciona de manera similar a una restricción FK. Por lo tanto, no puede haber registros en la tabla secundaria (OrderDetail) que no tengan un registro principal correspondiente (Orden). Entonces, lo que puede estar sucediendo es que cuando actualiza la tabla de datos de pedidos, con la consulta que menciona anteriormente, todavía hay filas secundarias en la tabla OrderDetail que tendrán referencias a los registros principales (Order) que ya no estarán allí después de la actualización. Dicho esto, si actualiza la tabla de datos de pedidos, también debe actualizar la tabla de datos de OrderDetail o eliminar la relación entre las dos tablas de datos.

Espero que esto ayude ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top