Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: matis2233 en 24 de Enero 2015, 03:34
-
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
-
Hola, si entiendo lo que tratas de hacer, cargas los datos desde una base de datos a un dataset. Luego modificas el dataset y quieres comprobar qué registros del dataset son diferentes a los que tienes en base de datos. Si es así, pienso que puedes crear un nuevo dataset a partir de lo que tengas en base de datos, comparar registro a registro lo que tengas en el dataset1 (modificado) frente a lo que tengas en el dataset2 (traído desde base de datos). Saludos
-
ok, pero entonces estos temas de concurrencia se manejan asi? a mano? tendria que comparar no solo los registros del dataset,sino que tambien comparar campo por campo en cada registro, no habria problema pero pense .NET tenia maneras de manejar esto, no hay otras maneras de manejar estos casos de concurrencia? gracias
-
Hola, lo que no acabo de ver es para qué necesitas hacer la comparación. Normalmente lo que se haría es reemplazar los datos que tienes en la base de datos con los nuevos datos, o recuperar los datos desde la base de datos. Si quieres hacer la comparación pienso que tienes que ir elemento a elemento (lo cual no significa que tengas que escribir las líneas, lo podrás hacer con un bucle) ::) Saludos
-
Hola, el problema es simple, yo muestro el resultado de un dataset en pantalla, imagina que el usuarioA modifica modifica varios de esos registros por ejemplo, haciendo un descuento al precio de todos los articulos de ese dataset, yo no quisiera guardar el resultado de aplicar ese descuento si el usuarioB ya aplico un descuento mientras yo estaba viendo el dataset viejo con los datos desconectados. En todo caso quisiera que esa orden "update precio set precio=precio*1,2" quisiera que se aplique sobre los precios que UsuarioB no hubiera modificado mientras yo estaba trabajando en modo desconectado. Me podrias ayudar con el codigo??? gracias
-
Hola, quizás sea simple aunque yo no acabo de entenderlo bien :-[, pero por la descripción que estás dando se trata de hacer algo así como control de concurrencia, y esto es todo una disciplina dentro de las bases de datos y de la gestión de transacciones en bases de datos... de hecho en el código que incluías al principio tenemos:
Data Source=C:\concurrencia\base.accdb;"
args.Row.RowError = "Violacion concurrencia optimista"
Hay varias formas de enfocar el control de concurrencia, tanto desde el punto de vista de las bases de datos como desde el punto de vista de la programación.
Un posible control de concurrencia para situaciones como la que planteas sería tener en cada tupla un campo adicional "contador de transacción" (o "número de versión") de modo que si cuando tú te descargas los datos este campo tiene valor por ejemplo 29 y cuando vas a actualizarlos tiene valor 30 significa que alguien escribió el dato y tu intento de escritura debe ser denegado.
Cada vez que se escriba una tupla, ese campo debe verse incrementado (autoincrementado) en una unidad, de ese modo puedes saber si ha habido cambios desde que tú empezaste la modificación hasta el momento en que tratas de escribir.
Esto es una idea la técnica de control de concurrencia denominada "control de concurrencia optimista sin validación de lectura" aunque no sé si esto te servirá.
Saludos
-
Eso es exacto, tambien se podria hacer con una campo datetime, pero seria hacerlo todo a mano, recorriendo registros, abriendo dataset, etc, etc.. por eso preguntaba si .Net ofrece alguna tecnica para este tema de concurrencia optimista. Si podrias aportar codigo me ayudarias. Gracias
-
¿Con qué versiones estás trabajando y con qué lenguajes? ¿Qué tipo de aplicación es la que estás generando?
-
Hola, con Visual Basic .NET 2008, bases de datos access y proveedor de datos OLEDB, gracias
-
Hola! El DataSet tiene un tableAdapter, dentro de la configuración del tableAdapter tienes establecida la sentencia sql que usas y elegida dentro de "Opciones Avanzadas" la opción "Usar concurrencia optimista"? Aquí hay una explicación en inglés que a lo mejor te sirve : https://msdn.microsoft.com/en-us/library/bb404102.aspx
-
HOla, no, no lo entiendo, podrias ayudarme con el codigo? gracias