2009-02-25 12 views
12

Así que tuve esto funcionando la semana pasada. Al menos, ¡pensé que sí! DataGridView UpdateLa actualización requiere un UpdateCommand válido cuando se aprueba la colección DataRow con filas modificadas

Entonces empezar a trabajar en el proyecto de nuevo hoy y estoy recibiendo

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

En

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

El StagingTableAdapter tiene una consulta adicional que toma 'filtro' como un parámetro. Eso fue utilizado para llenar la vista de grilla. 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 declaración de actualización con un generador de comandos. ¿Qué debo hacer?

Respuesta

6

El error es bastante literal: el adaptador necesita una instrucción SQL Update válida. 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 declaración 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.

+0

¿Por qué no se menciona nada de esto aquí? http://msdn.microsoft.com/en-us/library/ms233819(VS.80).aspx – Sam

+0

Esa página trata sobre el uso de un adaptador, no sobre la configuración de uno. Aquí está un poco más: http://msdn.microsoft.com/en-us/library/bz9tthwx(VS.80).aspx –

0

Desde la página:

Nota Si no hay suficiente información en la consulta principal, los comandos InsertCommand, UpdateCommand y DeleteCommand se crean por defecto cuando se genera el TableAdapter. Si la consulta principal de TableAdapter es 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 .

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

+1

Tenga en cuenta que las sentencias 'UPDATE' y' DELETE' no se pueden generar para tablas sin una clave primaria. Simplemente me encontré con el mismo problema, donde el PK se omitió en la tabla de la base de datos y el TableAdapter-Wizard no pudo generar el comando 'UPDATE', causando el comportamiento mencionado anteriormente. – froeschli

12

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(); 
+0

Esto funcionó para mí con SQLiteCommandBuilder (y, por supuesto, estaba usando el SQLiteDataAdapter). – styfle

+0

Esto también funcionó para mí usando Postgresql y NpgsqlDataAdapter – Kvothe

+1

Probablemente redundante, pero esto también funciona con SqlCommandBuilder y SqlDataAdapter – user230910

6

solución de Dan trabaja para mí, pero en lugar de OracleCommandBuilder que puede simplemente usar SqlCommandBuilder:

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

también se mostrará Este mensaje causado cuando usted no tiene definida una clave principal en la tabla están actualizando

+0

Y puede agregar una nueva fila incluso con una clave principal: es la actualización/eliminación que falla – MrTelly

0

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 el Server Explorer o Database Explorer. De lo contrario, el error seguirá existiendo.

0

También me enfrenté al 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());   
    } 
} 
+0

Su código no está formateado correctamente . por favor formatéelo. –

+0

SAM gracias por su respuesta intacta. Lo haré otro día. – MulugetaLegesse

0

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.

Cuestiones relacionadas