none
oracle Infracción de simultaneidad: UpdateCommand afectó a 0 de los 1 registros esperados RRS feed

  • Pregunta

  • Hola estoy conectando c sharp con una base de datos de oracle y utilizo dataadapter y data table para ello. Pero no hace la actualizacion de datos. Me da el error "oracle Infracción de simultaneidad: UpdateCommand afectó a 0 de los 1 registros esperados ". Segui distintos ejemplos para poder realizar la actualizacion mediante el dataadapter pero algo no debe estar funcionando. Mi codigo:

    public void actTable(DataTable tab) {
                misCert = new DataTable();
                
                string select = "select * from dgctconsultas.cert_prueba_firmas";// where firmaval='NO' or firmareg='NO'
                try
                {
                   
                  
                    datos.SelectCommand = new OracleCommand(select, cn);
                    OracleCommandBuilder cb = new OracleCommandBuilder(datos);
                    datos.Fill(misCert);
                    misCert = tab;
    
                    datos.UpdateCommand = cb.GetUpdateCommand();
                    datos.Update(misCert);
    
                  
                }
                catch (Exception e)
                {
                    logger.escribir(e.Message);
                }
    
            }
        }

    Los cambios en la tabla los hago por fuera del metodo, este solo actuliza los datos.

    Cualquier ayuda les agradecere .Saludos.

     
    viernes, 25 de noviembre de 2016 14:46

Todas las respuestas

  • Algo no tiene sentido en ese código. Estás cargando de datos un NUEVO datatable que llamas misCert. Pero justo después de haberlo llenado, en la variable misCert metes el datatable tab, con lo que se pierden todos los datos que habías cargado, y en consecuencia esa carga es inútil y ese Fill que has ejecutado no vale para nada. Después en el UpdateCommand del DataAdapter "datos" metes el resultado del GetUpdateCommand del commandbuilder, cosa que es inútil porque al haber construido el commandbuilder sobre ese dataadapter, ya le metió ese mismo updatecommand.

    Y finalmente haces un Update con los datos que hay en misCert (que son los mismos de tab). En ese momento, el Update examina todas las filas que hay en el datatable, y por cada cambio que encuentre (cambio relativo a lo que inicialmente se cargó en tab, no relativo a lo que se cargó en misCert, que fue inmediatamente destruido nada más cargarlo) envía al servidor una sentencia de actualización para grabar esa fila. Si al intentarla grabar se encuentra que en el servidor hay un registro distinto que el que inicialmente se cargó en tab la primera vez, entonces arroja el error de concurrencia que estás viendo, indicando que ya no puedes (o no debes) grabar esos datos porque mientras tanto han sido modificados en el servidor).

    viernes, 25 de noviembre de 2016 19:37
    Moderador