Hola amigos,
Estoy trabajando con transacciones ahora por primera vez y tengo un pequeño problema, el cual parecen no ayudarme para nada ni los tutoriales sobre transacciones ni la información que he podido encontrar a través de la red.
El caso es que el problema viene a la hora de actualizar una base de datos. Lo hacía perfectamente antes de incluir transacciones pero ahora ya no lo hace porque salta una excepción con este error:
"No se puede actualizar; actualmente este elemento está bloqueado"
¿Sabéis alguna posible causa?
Gracias anticipadas
Pd: Aquí os dejo un fragmento del código por si sirve de ayuda:
Código:
'HILO ACTUALIZA BASE DE DATOS
'descripción: se encarga de actualizar la base de datos cada cierto
'tiempo, según un valor introducido por un usuario en un campo de
'texto
Public Shared Sub EjecutaHiloActualizaBD()
'Objeto que inicia la conexión a la base de datos
Dim objConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\SuperPinwi\Mis documentos\Mis bases de datos\numeros\numeros.mdb")
'Objeto que permite realizar conexiones con la base de datos
Dim objAcciones As New OleDbCommand
'Tabla de datos en la cual se almacenarán los datos de la base de datos
Dim dt As DataTable
'Objeto adaptador entre el código y la base de datos
Dim objAdapter As OleDbDataAdapter = New OleDbDataAdapter
'Objeto que permite actualizar la base de datos
Dim OleDbUpdateCommand As OleDbCommand = New OleDbCommand
'Variable que permite establecer datos
Dim miDataSet As New DataSet
'Variable de bucle
Dim i As Integer
'Para conocer el número de filas
Dim n As Integer
'Cadenas temporales para nombre y numero
Dim sNombre As String
Dim nNumero As Integer
Dim idN As Integer
'Variable temporal para el almacenamiento de filas de la base de datos
Dim dr As DataRow
'Variable de bucle que recorre las filas
Dim fila As Integer
'Variable temporal en la que se almacena el valor con el cual se ha de actualizar la base de datos
Dim porcentaje2 As Integer
'Variable utilizada para pasar a la fila siguiente de la base de datos
Dim identificador As Integer
'Variable de manejo de la transacción
Dim Transaccion As OleDbTransaction
'Dim Transaccion2 As OleDbTransaction
Try
'Se abre la conexión
objConn.Open()
objAdapter = New OleDbDataAdapter("SELECT * FROM numeros ORDER BY numero", objConn)
'Se asigna un manejador al objeto de acciones y al objeto adaptador
objAcciones.Connection = objConn
'Inicio de la transacción
Transaccion = objConn.BeginTransaction()
OleDbUpdateCommand.Connection = objConn
OleDbUpdateCommand.Transaction = Transaccion
objAcciones.Transaction = Transaccion
'Transaccion = objConn.BeginTransaction()
'OleDbUpdateCommand.Connection = objConn
objAdapter.UpdateCommand = OleDbUpdateCommand
objAdapter.UpdateCommand.Transaction = Transaccion
objAdapter.SelectCommand.Transaction = Transaccion
dt = New DataTable
objAdapter.Fill(dt)
'Se guarda el número de filas de la base de datos en n
n = dt.Rows.Count
If n = 0 Then
MessageBox.Show("No se ha encontrado ningún registro que coincida con la selección")
Else
'Controla que el valor que se ha introducido en el campo de texto sea numérico
If IsNumeric(TxtBxPorcentaje.Text) = True Then
For Each dr In dt.Rows
idN = dr("ID")
'obtenemos el valor que se haya en el campo número de la fila actual de la base de datos
nNumero = dr("numero")
'hallamos el valor por el que se ha de sustituir lo que se encuentra en la fila actual
porcentaje2 = nNumero + TxtBxPorcentaje.Text
'Ejecutamos la consulta SQL de actualización de la base de datos
OleDbUpdateCommand.CommandText = "UPDATE Numeros SET numero = " & porcentaje2 & " WHERE ID = " & idN
OleDbUpdateCommand.ExecuteNonQuery() -- ERROR
Next
Else
MessageBox.Show("El valor que ha introducido para actualizar la base de datos no es válido, recuerde que debe ser de tipo númerico", "Aviso")
End If
Transaccion.Commit()
MessageBox.Show("BD Actualizada con éxito")
End If
Catch dcbx As DBConcurrencyException
MessageBox.Show("Error de concurrencia " & Err.Description, "Información del sistema")
Catch ex As Exception
'en el caso de que haya algún problema, se muestra un aviso con la información del error
Transaccion.Rollback()
MessageBox.Show(Err.Description, "Información del sistema")
Finally
'Cierra la conexión
objConn.Close()
End Try
End Sub