Autor Tema: Parametros Sql y @oldvalue Ado.net Visual Basic con dataset  (Leído 8081 veces)

matis2233

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
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

Código: [Seleccionar]
    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
« Última modificación: 25 de Enero 2015, 21:40 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #1 en: 25 de Enero 2015, 21:43 »
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

matis2233

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #2 en: 25 de Enero 2015, 23:27 »
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

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #3 en: 26 de Enero 2015, 16:27 »
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

matis2233

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #4 en: 26 de Enero 2015, 22:37 »
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

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #5 en: 27 de Enero 2015, 23:25 »
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

matis2233

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #6 en: 28 de Enero 2015, 06:37 »
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

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #7 en: 28 de Enero 2015, 08:17 »
¿Con qué versiones estás trabajando y con qué lenguajes? ¿Qué tipo de aplicación es la que estás generando?

matis2233

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #8 en: 28 de Enero 2015, 17:07 »
Hola, con Visual Basic .NET 2008, bases de datos access y proveedor de datos OLEDB, gracias

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #9 en: 29 de Enero 2015, 13:16 »
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

matis2233

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Parametros Sql y @oldvalue Ado.net Visual Basic con dataset
« Respuesta #10 en: 16 de Febrero 2015, 21:54 »
HOla, no, no lo entiendo, podrias ayudarme con el codigo? gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".