none
Parametros Sql y @oldvalue Ado.net RRS feed

  • Pregunta

  • Hola, tengo un problema, estoy probando un codigo que lo que hace es llenar un dataset, esto en el evento Load. Pero luego, en button1_click necesito comparar los valores viejos de la base de datos con los valores nuevos. Para saber si estos registros que cargue en form1_load cambiaron luego cuando hago button1_click, el problema esta en que no se como hacer que @oldnombre y @oldapallido tome cada uno de los diferentes valores de los diferentes registros del conjunto de datos. Gracias

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Try

                connetionString = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=C:\concurrencia\base.accdb;"

                connection = New OleDbConnection(connetionString)

                connection.Open()

                adapter = New OleDbDataAdapter("SELECT * from tabla2", connection)

                adapter.Fill(DataSet, "tabla2")

              

            Catch ex As Exception

                MsgBox(ex.ToString)

            End Try

        End Sub

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Try

                Dim comando As OleDbCommand = connection.CreateCommand()

                adapter.UpdateCommand = New OleDbCommand("UPDATE tabla2 set nombre=@nombre, apellido=@apellido WHERE nombre=@oldnombre AND apellido=@oldapellido", connection)

               

                adapter.UpdateCommand.Parameters.Add("@nombre", OleDbType.VarChar, 255).Value = txtID.Text

                adapter.UpdateCommand.Parameters.Add("@apellido", OleDbType.VarChar, 255).Value = txtCharData.Text

              

                parameter = adapter.UpdateCommand.Parameters.Add("@oldnombre", OleDbType.VarChar, 255, "nombre")

                parameter.SourceVersion = DataRowVersion.Original

                parameter = adapter.UpdateCommand.Parameters.Add("@oldapellido", OleDbType.VarChar, 255, "apellido")

                parameter.SourceVersion = DataRowVersion.Original

                AddHandler adapter.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)

        

                adapter.Update(dataset, "tabla2")

                connection.Close()

           

        End Sub

     Sub OnRowUpdated(ByVal sender As Object, ByVal args As OleDbRowUpdatedEventArgs)

            If args.RecordsAffected = 0 Then

                args.Row.RowError = "Violacion concurrencia optimista"

                args.Status = UpdateStatus.SkipCurrentRow

            End If

        End Sub

       

    End Class

     

    sábado, 24 de enero de 2015 2:22

Todas las respuestas

  • ¿Cuando vas a dejar de repetir la pregunta y a aceptar las respuestas que te dan?

    https://social.msdn.microsoft.com/Forums/es-ES/3c641b22-a85e-47ba-822a-45b0ed6fac8f/concurrencia-en-adonet?forum=netfxwebes

    https://social.msdn.microsoft.com/Forums/es-ES/d3808f45-825b-44da-b17d-50a78798e93f/comprobar-cambios-en-los-registros?forum=winformses

    En mi drop box tienes un ejemplo completo de gestión de concurrencia en ADO.NET "como Dios manda":

    https://www.dropbox.com/s/bsh05tb60u99nqx/WinShop.zip?dl=0

    Donde se detectan y gestionan conflictos de concurrencia tanto para un sólo registro como var varios registros.

    sábado, 24 de enero de 2015 12:27
  • hola

    quizas ayude

    Simultaneidad optimista

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 24 de enero de 2015 14:23
  • Hola Leandro, el codigo que puse lo saque de esa misma pagina, pero le falta algo para que funcione, y lo que le fatla es, como dije  hacer que @oldnombre y @oldapallido tome cada uno de los diferentes valores de los diferentes registros del conjunto de datos.

    Por eso que ese codigo, del link que me pasas no funciona, porque ellos no pusieron esa rutina para hacer coincidir los @oldnombre y @oldapellido con los registros (no solo un registro, sino todos los que tenia en el conjunto de datos)

    o sea, yo en algun momento de mi programa cargo un conjunto de datos en el dataset, y en otra parte de mi programa quiero modificar con una sentencia  "UPDATE tabla2 set nombre=@nombre, apellido=@apellido WHERE nombre=@oldnombre AND apellido=@oldapellido"

    quiero modificar todos los registros de ese conjunto de datos pero solo los que no se modificaron (es un entorno multiusuario), o sea que cada @oldnombre tendria que tomar el valor de cada registro, el valor tal como estaba cuando cargue mi conjunto de datos la primera vez, y que se modifiquen(con esa sentencia update) todos aquellos donde se cumpla que nombre=@oldnombre y apellido=@oldapellido

    el ejemplo de Microsoft, al que ambos estamos apuntando, seria el indicado, y es el que propone MIcrosoft. Pero los @old..  no toman los valores de cada uno de los campos.

    Gracias Leandro




    • Editado micase sábado, 24 de enero de 2015 22:50
    sábado, 24 de enero de 2015 21:22
  • Jesus, te escribo por ultima vez, te conozco de otros hilos, y cada vez que me ecribis es para descalificar y por temas personales, ademas fijate que en los hilos anteriores, ante la primer respuesta que me dan ya queres cerrar el hilo. Entende que es un foro par aprender, yo estoy empezando y me cuesta mucho esto. Te pido por favor que uses los foros para responder cosas del foro, pero para eso hay que leer lo que la otra persona pregunta. Lee bien lo que pregunto en el foro. se trata de los @oldnombre y @oldapellido, acaso no logras entender eso??, fijate tambien lo que le respondo a Leandro, Leandro saco el ejemplo del mismo lugar de donde lo saque yo, es de la pagina de Microsoft. tengo demasiada claridad para exponer el tema. en el hilo que me pasas, hilo que habia iniciado yo, no se me responde lo que pregunte. lee cual es la cuestion si queres, fijate lo que pregunto en este hilo y te daras cuenta que la respuesta de lo que pregunte no esta en el hilo que me estas pasando ahora y  si tenes un minuto de tu tiempo y tenes ganas, podes ayudarme tambien. Pero lee bien el problema en este hilo, y si no sabes cual es el problema, copia el codigo que puse y ejecutalo. Los links que me pasaste no tienen nada que ver con lo que pregunto. Sabes que hace muchos dias que estoy con esto y me saca tiempo y esfuerzo, al igual que a vos. Otra vez mas te digo que te agradezco tus respuestas en otros hilos, pero te pido que por favor no respondas mas si no vas a contriubuir en el foro. Y entende que los hilos se cierran cuando estan completamente entendidos, entende que hay gente que le cuesta y recien empieza y necesita el codigo completo de cierto asunto para poder entender el tema.  Por ultimo te digo que no me gusta discutir con nadie, creo que soy buena persona y ademas esto no es un foro para eso. Me gustaria ayudar como vos en el foro, pero para eso necesito aprender mucho.Te pido por favor que si no queres ayudarme no me repondas mas, porque me estas perjudicando de la otra manera y te lo digo de buena manera, no hay por que discutir y pelear, no hay que discutir y pelear con nadie y hay cosas peores para discutir. Vuelvo a decirte una vez mas, valoro que me repondas gratuitamente, vos perdes tiempo y esfuerzo con esto y supongo que no lo haces por algo, pero no por eso puedo cerrar un hilo y dejar de preguntar si me responden otra cosa distina a la que pregunto, me perjudico yo y tambien perjudico a la gente que tiene el mismo problema que yo y esta buscando el problema que planteo en este foro. Gracias Jesus











    • Editado micase sábado, 24 de enero de 2015 22:46
    sábado, 24 de enero de 2015 21:29
  • El tema es exáctamente el mismo, la gestión de la concurrencia. La técnica que estás intentando usar es la misma que usa el datadapter para la gestión de la concurrencia, poner los valores originales en la where y si no hay registros afectados lanzar la excepción. A ver por qué entonces no tomas el ejemplo del drop box y lo utilizas para gestionar la concurrencia en vez de seguir preuntando lo mismo una y otra vez cuando la pregunta está respondida.
    jueves, 29 de enero de 2015 6:39
  • El proceso es el siguienteç:

    1. Cargas los datos en un datatable mediante un data adapter
    2. Modificas los datarows del datatable
    3. Guardas los datos cambiados en el datatable usando Adapter.Update

    Si el data adapter tiene bien configurados los comandos, entonces al hacer Adapter.Update si hay algún conflicto de concurrencia el adapter lanza la excepción.

    No tienes que responder a los eventos del dataadapter como estás haciendo ahora, ni ejecutar directamente el comando de actualización como estabas intentando hacer otras veces.

    Tienes el ejemplo completo en el Drop Box. Pero sigues dándole vueltas sin ninguna razón.

    jueves, 29 de enero de 2015 6:52