La actualización requiere un UpdateCommand válido cuando se pasa la colección DataRow con filas modificadas

Así que tuve esto funcionando la semana pasada. Al menos, ¡pensé que sí! Actualización de DataGridView

Entonces empiezo a trabajar en el proyecto nuevamente hoy y estoy consiguiendo

La actualización requiere un UpdateCommand válido cuando pasa la colección DataRow con filas modificadas.

En

scDB.SSIS_Configurations_StagingDataTable table = (scDB.SSIS_Configurations_StagingDataTable)stagingGrid.DataSource; myStagingTableAdapter.Update(table); 

StagingTableAdapter tiene una consulta adicional que toma ‘filter’ como parámetro. Eso fue utilizado para llenar el DataGridView . En el asistente para crear esa consulta, veo ‘se generó la actualización’. Veo que la mayoría de las publicaciones con este error requieren que se genere una statement de actualización con un generador de comandos. ¿Qué debo hacer?

El error es bastante literal: el adaptador necesita una statement válida de SQL Update. Los diseñadores de conjuntos de datos y CommandBuilders generarán estos para usted, pero tampoco hay nada de malo en crear a mano un poco de SQL.

De todos modos, deberá verificar (depurar) que la statement de actualización todavía está configurada y lo que realmente es. Podría ser más un problema SQL que C #.

Editar: las herramientas del Creador de comandos solo manejarán una sola tabla recta, declaraciones Select. Use una unión o algo sofisticado y estará solo.

Este mensaje también se mostrará cuando no haya definido una clave principal en la tabla que está actualizando.

Me encontré con el mismo problema que Sam. Tenía un código de trabajo que de repente ya no funcionaba. No sabía cuándo lo escribí, pero debe haber inferido automáticamente el comando de actualización y luego dejó de hacerlo. Tal vez un service pack de MS entre versiones que nunca notamos. De todos modos, la solución con la que me encontré es usando un OracleCommandBuilder (en mi caso para Oracle) que toma el DataAdapter (después del relleno de llamadas) como parámetro para el constructor y luego llama a GetUpdateCommand () y lo asigna al UpdateCommand en el DataAdapter.

 pseudocode: DataAdapter da = new DataAdapter(...) ... da.Fill(); da.UpdateCommand = new OracleCommandBuilder(da).GetUpdateCommand(); ... da.Update(); 

La solución temporal de Dan funciona para mí, pero en lugar de OracleCommandBuilder puedo usar SqlCommandBuilder:

 DataAdapter da = new DataAdapter(...) ... da.Fill(); da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand(); ... da.Update(); 

Acabo de experimentar el mismo problema, y ​​la respuesta de Jason funcionó para mí: olvidé asignar una clave principal para mi mesa.

Solo un recordatorio más para agregar: después de corregir el problema en la tabla, cuando regrese a Visual Studio, en el archivo .xsd que contiene el conjunto de datos, asegúrese de eliminar la tabla original y agregarla nuevamente desde Server Explorer o Database Explorador. De lo contrario, el error seguirá existiendo.

Siempre debe tener un campo de columna definido por la clave principal. De lo contrario, el problema siempre existirá. SqlCommandBuilder no lo ayudará si no tiene un campo de clave principal.

También enfrenté el mismo problema y obtuve la siguiente solución. Intentalo.

 private void btnSave_Click(object sender, EventArgs e) { ConnStr = "Data Source=FIN03;Initial Catalog=CmsTest;Integrated Security=True"; cn = new SqlConnection(ConnStr); cn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = cn; mytran = cn.BeginTransaction(IsolationLevel.Serializable ); cmd.Transaction = mytran; try { scb = new SqlCommandBuilder(da); da.Update(ds, "tblworker"); mytran.Commit (); MessageBox.Show("Data update successfully"); } catch (Exception err) { mytran.Rollback(); MessageBox.Show(err.Message.ToString()); } } 

De la página:

Nota Si hay suficiente información en la consulta principal, los comandos InsertCommand, UpdateCommand y DeleteCommand se crean de forma predeterminada cuando se genera TableAdapter. Si la consulta principal de TableAdapter es más que una sola instrucción SELECT de tabla, es posible que el diseñador no pueda generar InsertCommand, UpdateCommand y DeleteCommand. Si estos comandos no se generan, puede recibir un error al ejecutar el método TableAdapter.Update.

Entonces, por lo que puedo decir, estas declaraciones deberían haberse generado. Estoy usando una sola tabla.

Como han dicho otros, debe asegurarse de tener una clave principal establecida en la tabla para que se cree el código de actualización generado automáticamente. Hice esto pero seguía viendo el mismo mensaje de

La actualización requiere un UpdateCommand válido cuando pasa la colección DataRow con filas modificadas.

Luego descubrí que también necesita actualizar el adaptador de tabla (¡tiene sentido cuando lo piensa!).

Mientras hace esto, también puede valer la pena verificar dos veces que haya seleccionado la opción Generar Insertar, Actualizar y Eliminar declaraciones (como se muestra a continuación).

enter image description here

A continuación, simplemente haga clic en el asistente, la pantalla final debería confirmar que creará el código rehacer requerido (ahora con la clave principal):

enter image description here