Usuario
Parametros Sql y @oldvalue Ado.net

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
Todas las respuestas
-
¿Cuando vas a dejar de repetir la pregunta y a aceptar las respuestas que te dan?
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.
-
-
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
-
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
-
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.
-
El proceso es el siguienteç:
- Cargas los datos en un datatable mediante un data adapter
- Modificas los datarows del datatable
- 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.