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
![sonriente](http://static.forosdelweb.com/fdwtheme/images/smilies/smile.png)
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