Infracción de Simultaneidad: UpdateCommand afectó a 0 de 1 registros esperados.

Pregunta Infracción de Simultaneidad: UpdateCommand afectó a 0 de 1 registros esperados.

  • sábado, 14 de enero de 2012 22:39
     
     

    Hola. Espero puedan ayudarme. Bueno vamos derecho al grano.

    Tengo este problema desde hace varios días con c# y MySql, me salta este cartel gracias a la captura de la excepción  System.Data.DBConcurrencyException : "Infracción de Simultaneidad: UpdateCommand afectó a 0 de 1 registros esperados.".

    Esto se produce cuando intento actualizar un DataTable usando MySqlDataAdapter. Lo mismo hace usando un DatSet. En tablas con una sola clave no hay problema, se actualiza sin dramas, pero en tablas con 2 o más claves compuestas no se actualiza y salta dicho error. 

    A continuación expongo el código:

    public class newSQLBinding
    {
            //BindingSource  
        private BindingSource bs = new BindingSource();
        // Adaptador de datos sql  
        MySqlDataAdapter SqlDataAdapter;
    MySqlCommandBuilder SqlCommandBuilder;
        // Cadena de conexión  
        string cs;
       string tablasql;
     
        public newSQLBinding(ref BindingSource binsour,StructConexion stconexion)
        {
            cs="Server="+stconexion.server+";Uid="+stconexion.user+";PASSWORD="+stconexion.pass+";Database="+stconexion.database+";Port="+stconexion.port+";";
            binsour.DataSource=bs;
            tablasql=stconexion.table;//La tabla que quiero actualizar
         }
        
        

        public void CargarRegistros()
        {
                try {
                // Inicializar el SqlDataAdapter indicandole el comando y el connection string  
                SqlDataAdapter = new MySqlDataAdapter("SELECT *FROM "+tablasql, cs);
                SqlCommandBuilder = new MySqlCommandBuilder(SqlDataAdapter);

                // llenar el DataTable  
                DataTable dt = new DataTable();
                SqlDataAdapter.Fill(dt);

                // Enlazar el BindingSource con el datatable anterior  
                        bs.DataSource = dt;

            }

            catch (MySqlException exSql) {
                MessageBox.Show(exSql.Message.ToString());
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message.ToString());}
            
        }
        
        
        public void Actualizar()
        {
            // Actualizar y guardar cambios  
            if ((bs.DataSource != null))
            {try{
                    try{
                
             SqlDataAdapter.Update((DataTable)bs.DataSource);
                
                    }
                catch(MySql.Data.MySqlClient.MySqlException e){
                    
                    if(e.Number==1582)
                        MessageBox.Show("Código ya existente, por favor ingrese otro código.");
                }
                }catch(System.Data.DBConcurrencyException ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
                catch(System.InvalidOperationException ex)
                {
            MessageBox.Show(ex.Message.ToString());
                }
                
            }
        }
        
    }

     

    Bien, paso a explicar la clase, Lo que hace esta clase se le pasa el BindingSource por referencia, un StructConexion es una estructura que contiene los datos de conexión, como nombre de server, de usuario, etc... La variable tablesql va a contener el nombre de la tabla que quiero enlazar. De esta manera obtengo un BindingSource listo para enlazar con un DatagridView u otro control que necesite cuando coloco luego el método CargarRegistros().

    Bien el drama se suscita solamente al hacer cambios en dicho BindingSource referenciado y al llamar al método "Actualizar" (Tengo un botón que llama a dicho método de la clase ya instanciada). Probé varias cosas, busqué en todos los foros, en google y no encuentro nada, sólo suelen decir que hagamos los cambios directos en la base de datos y que trabajemos un poco más, pero yo supongo que tiene que haber solución, sino para qué está el DataAdapter y el CommandBuilder, como verán uso MySql en su versión 5.5, la versión 6.0 no tenía este problema tan a "menudo" a veces sí a veces no, aunque sí lo tenía a la hora de hacer backups es  por eso que retomé la versión 5.5, además de que me dijeron que la 6.0 estaba discontinuada.

    Mi aplicación no requiere de muchos usuarios conectados a la vez así que si hay alguien que sepa alguna manera de desconectar la simultaneidad y que actualice sin importan si hay usuarios conectados, que me muestre el código de cómo hacerlo y se lo voy a agradecer.

    Saludos. 

     

Todas las respuestas

  • sábado, 14 de enero de 2012 23:58
    Moderador
     
     

    hola

    ese problema se geenra porque envias a actualziar informacion que no genera cambio alguno en los registros de la tabla

    por lo general el UPDATE lleva con sigo un WHERE para poder identificar que registros debe afectar, cuando este WHERE no encuantra registro falla con este error

     

    revisa que instruccion UPDATE genero el MySqlCommandBuilder porque por lo que entiendo no es del todo correcta

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
  • lunes, 16 de enero de 2012 6:54
     
     

    Hola Leandro, gracias por contestar, tardé en contestar yo porque intenté buscar soluciones probando distintos códigos a ver si funcionaban y no tuve éxito. Te cuento que el error sólo ocurre cuando efectivamente modifico al BindingSource generado y lo intento actualizar, si no lo modifico no se produce el error al actualizar.

    Revisé la instrucción UPDATE que generó el MySqlCommandBuilder como propusiste y es la siguiente:

     UPDATE `paises` SET `codigo_idioma_pais` = @p1, `nombre_pais` = @p2, `x` = @p3, `y` = @p4 WHERE ((`codigo_pais` = @p5) AND (`codigo_idioma_pais` = @p6) AND (`nombre_pais` = @p7) AND (`x` = @p8) AND (`y` = @p9))

    Te cuento que la tabla tiene clave primaria compuesta que se forma con las columnas codigo_idioma_pais y codigo_pais , codigo_pais está en autoincrement (Al sacar el autoincrement sigue con el mismo error, nada mas que agrega al SET `codigo_pais` = @p2 . La tabla estaba hecha en motor MyIsam las cuales cambié innodb para ver si desaparecía el error, pero no resultó. Lo que trato de hacer en los cambios es cambiar ciertos acentos mal colocados en la columna nombres de los países, en el BindingSource sí se corrigen, pero a la hora de actualizar manda el error antes mencionado. El error se produce solamente cuando son dos claves compuestas en una tabla, no se produce cuando hay una sola clave en la tabla, me gustaría resolver el drama de esta tabla así resuelvo el de otras que producen el mismo error con el mismo código.

    Desde ya muchas gracias.

     



  • martes, 15 de mayo de 2012 0:03
     
     

    Hola Becklespinax.

    Me acaba de suceder el mismo problema que a vos, en un sistema que sincroniza datos entre dos tablas en diferentes bases de datos. Me da la impresión que el problema está del lado del motor de base de datos, dado que el mismo sistema de sincronismo lo utilizo entre tablas de SQL Server y nunca tuvo inconveniente. Ocurre en la situación particular donde la tabla de destino está alojada en MySQL.

    Si has hallado la solución, te agradezco si me la acercas. Caso contrario, si lo soluciono te lo hago saber aquí.

    Saludos cordiales

    Jorge

  • lunes, 21 de mayo de 2012 2:20
     
     

    Hola Becklespinax / JGauna

    Tambien tengo este problema;

    estoy diseñando un sistema para gestionar informacion de inventario y ventas, tengo 2 plantillas que involucran al problema, una  que te da de alta los proveedores, contactos de proveedores y articulos de un sierto proveedor, y otra plantilla en la que apruebo una orden de compra ya generada.

    El mismo error de ustedes me sale cuando ejecuto el programa, doy de alta un proveedor y despues trato de aprobar un pedido, cuando hago esto ultimo es cuando me lanza la excepcion; pero si por ejemplo, ejecuto la aplicacion y directamente intento aprobar un pedido generado no me marca ningun error, y la aprobacion del pedido se realiza satisfactoriamente.

    Cuando me lanza el error dice: "incluya la logica en la aplicacion para administrar las infracciones de simultaniedad",

    si ustedes ya resolvieron esto, si me interesa que me guiaran, ya que estoy batallando mucho con esta situacion.

    les dejo mi correo electronico:

    oscar.a.sepulveda@hotmail.com

  • martes, 22 de mayo de 2012 23:47
     
     

    Hola Oscar. Te comento que no pude reproducir el error en el servidor de pruebas. El software es exactamente el mismo que el de producción, pero en éste el software corre perfectamente. Sigo investigando y te mantendré al tanto.

    Saludos cordiales.

    Jorge


    ------------------------------------------------------------ Jorge Gabriel Hernandez Gauna Ingeniero de Sistemas CTI: +54 (2262) 15-56-5517 msn: jhernandez_gauna@hotmail.com e-mail: jhernandezgauna@yahoo.com.ar skype: jorgegauna CEIN (Centro de Estudios Informáticos Necochea) http://www.cein.com.ar Calle 61 Nº 2972 Galería Huracán. Of. 6. Necochea - Bs. As. - Argentina Tel: +54 (2262) 42-0610 ------------------------------------------------------------

  • miércoles, 06 de junio de 2012 6:15
     
     
     

    Hola  Ozzy8804 y JHernandezGauna :

    Perdón que no haya contestado antes, olvidé de fijarme si alguien había contestado por un tiempo. Sigo con el mismo problema lamentablemente he estado probando de varias maneras, pero no consigo aún solucionar el error, a algunos se les ha solucionado por ejemplo no colocando autoincrement en la clave primaria, en mi caso se disminuyó las veces que me tira el error de simultaneidad actualizando el conector para MySQL a la ultima versión, aparte dejé de usar MySQL 6 y pasé a la 5.5 porque la 6 no se sigue desarrollando (se quedó en versión alpha y tenía problemas con los backup) igual con menos frecuencia pero lo sigue haciendo, lo peor de todo es que no siempre lo hace, a veces hago exactamente lo mismo y no me tira el error y hay solamente una conexión en la bd. Tal vez sea como dice JHernandezGauna un error de MySQL pero no estoy del todo seguro porque he visto en otros lados que a algunos de SQL Server suele hacerles lo mismo, quizás sean solo casos aislados. Como consecuencia de esto, directamente tuve que hacer las actualizaciones a "mano" es decir directo en la base de datos, usando el BindingSource solamente para mostrar los datos, lo cuál significaron mas días de codificación.

    Si alguien encuentra la solución, le serviría muchos ya que ahorra tiempo escribiendo código. Yo por mi parte sigo probando soluciones, si logro encontrarla se los estaré haciendo saber por acá.

    Saludos.

    German. 

     
    • Propuesto como respuesta Marcelo DD jueves, 07 de junio de 2012 4:54
    • Votado como útil Marcelo DD jueves, 07 de junio de 2012 4:55
    •  
  • jueves, 07 de junio de 2012 5:08
     
     

    Hola soy nuevo, pero tal vez pueda ayudar, ayer tuve este mismo error, pero sincronizando BD Access y MySql , gracias a dios lo pude solucionar. En mi caso tengo en el dataset varias datatable, y una de ella no la podía actualizar,  lo que hice fue elimine del dataset la datatable en cuestión,  después la volví a agregar de nuevo y se soluciono el inconveniente.  Yo supongo que en mi caso quedo algún valor de la datatable mal seteado, después de cambiar y agregarle columnas. Saludos

  • jueves, 07 de junio de 2012 21:58
     
     

    Hola SoftSinD, gracias por responder:

    Anoche vi tu comentario un par de minutos después que lo hiciste y entonces la siguiente hora y media estuve probando, pero no logré solucionarlo. Me acosté tarde con la típica bronca de no poder solucionar el problema jajajaja. Igualmente me quedaron en el tintero algunas pruebas que seguramente el fin de semana voy a probar a partir de tu solución. Generalmente en mi caso enlazo una tabla, uso un BindingSource, lo que hice siguiendo tu ejemplo fue eliminar el DataTable, volverlo a llenar y volverlo a bingdear, también probé no eliminando la tabla, pero sí llenando otro DataTable y usé la función Merge para mezclarlo con la tabla actualizada a ver si se reparaba el error que se producía (supongo que pone mal las claves primarias) que era una posible solución que dieron en otros foros, pero tampoco tuve éxito, además de intentar otras pruebas absurdas que mas de un programador mas experimentado querría matarme.

    Te agradecería que coloques alguna parte de tu código a ver si logro ver mas claro lo que hiciste, igualmente es esperanzador saber que alguien tuvo éxito jajaajaja.

    Saludos.

    German.

     

  • viernes, 08 de junio de 2012 9:01
     
     

    Hola, he tenido el mismo error y lo he solucionado.

    Prueba a quitar del where del update los campos que no sean claves

    Saludos.

    Fernando

  • viernes, 08 de junio de 2012 21:21
     
     

    Hola ferbest, gracias por responder:

    Hice lo que propusiste, pero no tuve éxito, en el caso mio que mas arriba expuse, saqué las dos claves primarias del where e hice lo siguiente:

     SqlDataAdapter.UpdateCommand=SqlCommandBuilder.GetUpdateCommand(); //Para que no dé referencia nula

     SqlDataAdapter.UpdateCommand.CommandText="UPDATE `paises` SET `codigo_idioma_pais` = @p1, `nombre_pais` = @p2, `x` = @p3, `y` = @p4 WHERE ((`codigo_pais` = @p5) AND (`codigo_idioma_pais` = @p6))"

    Es decir que le saqué los campos (`nombre_pais` = @p7) AND (`x` = @p8) AND (`y` = @p9) del where, también probé de sacar codigo_idioma_pais` = @p1 del SET por las dudas así no reforma esta clave primaria y tampoco anduvo.

    Veré luego de seguir jugando con lo mismo. También voy a ver si lo paso a otra BD como PostgreSQL a ver si dá error al actualizar también (Por ahora no pruebo SQL Server porque es muy poco lo que sé de esta BD que en el futuro cercano seguramente la estudiaré con mayor profundidad) y despejo las dudas si es culpa de algún bug de MySQL solamente o de su conector. 

    Saludos.

    German.

  • domingo, 29 de julio de 2012 2:51
     
     

    Bueno, había dicho que iba a intentar pasar a PostgreSQL a ver si tenía éxito, el drama de Postgre es que su conector no trae el método Update del adapter que sí trae el conector Mysql Connector, así que quedó obsoleta la prueba en Postgre, probé en SQLite que sí trae este método, pero esta última  tiene el drama de que no es Cliente - Servidor, igualmente también me dió el maldito error de la simultaneidad alguna que otra vez al llamar al método Update (eso que SQLite en teoría bloquea la BD cuando se actualiza por lo tanto en ese momento a diferencia de otras BD nadie puede acceder, por lo tanto es incomprensible el error de simultaneidad en la misma) si bien no fue en este caso que describo arriba, fue cuando intentaba actualizar una tabla a la cuál le modificaba un valor, imagino que para este caso ocurriría iguál o peor. Para no perder mas tiempo todos los proyectos que vengo haciendo, ya los estoy pensando de forma de no utilizar el Update del adaptador. Si bien hay momentos que deja de existir el error, uno no puede confiarse porque si le entregás al cliente el software es muy probable que le aparezca en algún momento, lo que conllevaría a reclamos y nuevas pérdidas de tiempo. La otra opción que queda, es pasarse a SQL Server, he visto que a algunos les dá este error, les pone error de concurrencia en vez de simultaneidad, a pedir de las palabras debe ser el mismo error supongo. Por ahora no queda otra cosa que: DEJAR DE PENSAR EN LA EXISTENCIA DEL DATAADAPTER Y SU MALDITO MÉTODO UPDATE(DATATABLE).

     
  • martes, 25 de septiembre de 2012 17:34
     
     

    Amigos,pude resolver mi problema de la siguiente manera

            mDa.Update(mDs, mTabla)
            mDs.AcceptChanges()
            mDa.Fill(mDs, mTabla)

    Luego de Hacer el Update y Aceptar los cambios hay que volver a crear la tabla

  • lunes, 01 de octubre de 2012 21:43
     
     
    lnad74 Muchas Gracias, voy a probar en estos días y te digo como me fue a ver si me sirve tu solución.
  • miércoles, 10 de octubre de 2012 20:25
     
     
    Hola Amigos tengo el mismo problema no se ustedes pero no se si tenga que ver con la cantidad de campos dentro de la tabla ya que reciente acabo de terminar un proyecto y no me dio este error estoy empezando otro y si me sale yo estoy usando acces pense que era un tema de motor de base de datos pero veo q pasa lo mismo con MySql entonces pienso que pueda ser algo de eso de cantidad de campos que se intentan actualizar...
  • viernes, 12 de octubre de 2012 2:43
     
     

    Hola el_sabueso, no es la cantidad de campos ni la base de datos, ya que me hizo lo mismo en una base de datos en la cuál quería actualizar una tabla con sólo 3 campos, es un problema de ADO.NET. Hacé como yo, pensar en hacer reformas directamente en la bd sin usar Update (mentalizarse desde el inicio usando SQLCommand y ExecuteNonQuery para hacer el UPDATE directamente en la BD y sí usar SQLCommandBuilder Y El Adapter para leer y meter en datasets y bindingsource) al menos por ahora hasta que haya alguna solución, me vuelve loco a mi, porque no hace siempre el error, algunas veces sí y otras no en algunos casos y en otros sí lo hace siempre, sobre todo en tablas con más de una clave primaria.

    lnad74 tu solución lamentablemente no me funcionó ya que en el mDa.Update(mDs, mTabla) es donde se produce la excepción de simultaneidad, por lo tanto las dos líneas siguientes no se ejecutan. Gracias de todas maneras, si tenés alguna otra posible solución comentala así la pruebo.