2009-06-05 13 views
6

Estoy peleando contra un recalcitrante diseñador de DataSet VS2008, parece. He intentado hacer lo que parece ser una simple solución de dos conjuntos de datos, donde una tabla es simplemente el significado textual de un valor entero almacenado en la otra tabla. el diseño básico de datos 101.¿Qué pasó con los comandos Update y Delete de mi TableAdapter?

Table1 
CharField1 
CharField2 
IntForeignKeyField1 
etc 

Table2 
IntPrimaryKey1 
ValueForKeyField 

que en realidad no afecta el problema que estoy teniendo, no creo, ya que no estoy queriendo hacer otra cosa que leer los valores desde la segunda mesa de modo que pueda elíjalos en DataGridViewComboBoxColumn en el cliente; nunca los editaré en el cliente. Pero yo divago.

Dado que esto vive en un servicio web, y quería un conjunto de datos fuertemente tipado entregado a los clientes de este servicio web, decidí usar DataSet Designer para construir TableAdapters y todas las tuberías, pensando que podría ser menos trabajo y más fácil de mantener.

Por lo tanto, creé las cajas bonitas y edité las instrucciones de selección, indicándole al diseñador que creara todos los comandos Insertar, Actualizar y Eliminar para usar en el adaptador de tabla. Me complace felizmente, informándome que todo estaba hecho como lo pedí.

Cuando traté de usar la declaración de actualización, sin embargo, recibí un error que decía que no había una declaración de actualización válida. Después de buscar infructuosamente a personas con problemas similares en la web, busqué en el XML para el conjunto de datos. Efectivamente, ninguna instrucción Update ni ninguna instrucción Delete.

Intenté eliminar por completo y volver a crear el DataSet del proyecto, con los mismos resultados. No se crearon sentencias Update o Delete, aunque se informó como hecho.

Terminé construyendo el XML de la declaración de actualización a mano, inspeccionando otro conjunto de datos diseñado de otro proyecto, por lo que el servicio web ahora está funcionando. Sin embargo, no tengo fe en absoluto de que mis cambios duraran a través de una edición iniciada por el diseñador, y no estoy seguro de por qué no está funcionando. ¿Algunas ideas?

Gracias por cualquier comentario, de Dave

+1

De la falta total de comentarios, supongo que esto no le ha sucedido a nadie más, así que tengo un verdadero error o error en mi implementación de VS2008. Estupendo. Y obtuve una maldita insignia de tumbleweed por el privilegio también. – DaveN59

Respuesta

13

Podría ser que no hay ninguna clave primaria única definida para la tabla?

+0

Doh! Gracias por señalar lo obvio ... – DaveN59

+0

No me siento mal por eso, acabo de hacer lo mismo :(Configurar el PK en el DB me solucionó el mismo problema. – sMaN

0

Estoy teniendo el mismo problema. TableAdapter no funciona correctamente cuando se usan campos de más de una tabla. Pude volver a crear la solución del siguiente artículo: "Actualización del TableAdapter para usar uniones".

http://www.asp.net/learn/data-access/tutorial-69-vb.aspx

La solución implica la creación de su propio Seleccionar/Actualización/Insertar/Eliminar procedimientos. Desafortunadamente, aunque pude seguir la solución para una base de datos sqlserver, todavía no puedo hacer que funcione para mi base de datos local de Access. Todas las opciones de procedimiento almacenado están atenuadas.

¡Buena suerte!

+0

Gracias por el enlace al artículo. El problema (y quizás el tuyo también) es más simple que eso. Todo lo que tenía que hacer era definir claves primarias y una relación en el diseñador de SQL Studio, y a VS le gustaba. No sé cómo se ven tus datos, pero VS puede obtener bastante información de SQL Server, o no, aparentemente. – DaveN59

0

Creo que encontré la solución. 1) Cree un TableAdapter solo para la tabla principal y copie el procedimiento UPDATE de TableAdapter (almacenado en la ventana de propiedades TableAdapter) 2) Cambie la consulta SELECT en el "TableAdapter Configuration Wizard Query Builder" para incluir campos de ambas tablas y la unión. 3) Pegue el antiguo procedimiento de ACTUALIZACIÓN en el procedimiento ACTUALIZACIÓN TableAdapter ahora vacío. 4) Después de crear DataGridView, puede mostrar los campos de ambas tablas y actualizar la tabla principal. Repita los pasos para INSERTAR & ELIMINAR comandos.

Si su objetivo es actualizar ambas tablas, intente buscar en TableAdapter Parent/Child información de actualización en la web. Aquí hay un buen enlace: http://blogs.msdn.com/bethmassi/archive/2009/05/14/using-tableadapters-to-insert-related-data-into-an-ms-access-database.aspx

+0

¡Demasiado trabajo! :) Eso es esencialmente lo que hice para que funcione. Sin embargo, funcionó mucho más suave y más limpio, sin cambiar nada manualmente, cuando definí claves primarias y relaciones en la base de datos - VS2008 descubrió cómo hacer lo que tenía que hacer a partir de esa información, sin intervención manual ... – DaveN59

+0

¿Tienes esta solución para trabajar con MS Access? Estoy teniendo este problema exacto y estoy intentando que tu método funcione. –

0

Simplemente se produjo el mismo problema básico. Le dije al diseñador de datos que creara todas las instrucciones de inserción, actualización y eliminación. Cuando fui a actualizar una de las tablas, no hubo actualizaciones disponibles. Finalmente ingresé al archivo .xsd creado por el diseñador de datos (solo hizo doble clic para abrirlo en el IDE). Luego hice clic derecho en la barra de título de la tabla que tenía el problema y seleccioné la opción de configuración. A partir de allí, hice clic en el botón 'Opciones avanzadas' y luego seleccioné la opción 'Generar inserción, actualizar, eliminar declaraciones'. Después de presionar Ok, verifiqué mi proyecto y la actualización estaba disponible para el adaptador de mesa.

0

Lo que George sugirió es genial. Necesitamos habilitar la opción 'Generar Insertar, Actualizar, Eliminar Declaraciones'.

Sin embargo, en VS2013, el uso de calificadores de tabla innecesarios en la instrucción selete puede alterar el IDE y dar como resultado la generación de instrucciones SELECT e INSERT solamente. Solo elimina estos calificadores y debería estar bien. Asegúrate de tener un PK único también.

Si necesita utilizar el relleno complicado como aplicar filtro para devolver ciertas filas de la tabla solamente, puede completar la tabla de datos utilizando la instrucción de selección específica en el evento de carga de formulario. De esta forma, las sentencias INSERT, UPDATE y DELETE generadas seguirán funcionando, porque DELETE y UPDATE funcionan en PK.

Cuestiones relacionadas