Visual Basic.NET - Problemas con transacciones

   
Vista:

Problemas con transacciones

Publicado por Pakor (3 intervenciones) el 08/07/2011 10:08:25
Ayuda con las tansacciones. Progamo en vbnet contra sqlserver 2005 express.

Tengo un entorno en el que necesito hacer una transaccion para un proceso que me esta dando problemas.
Tengo en una tabla un contador que uso para asignar numero de expediente. Cuando entra a esta parte un usuario, creo la transaccion, leo la tabla contador, calculo su siugiente valor, y actualizo su valor en la base de datos.

Select contador form CONTADORES

Update contador into CONTADORES
(Si ya se que no es sintaxis SQL pero esto es lo que quiero hacer, estas dos operaciones como una sola transaccion cerrada y totalmente bloqueada).

El problema es que me encuentro que se producen lecturas del contador desde otros usuarios, de forma que dos expedientes resultan teniendo el mismo valor del contador. No me aisla estas dos operaciones y no se porque.

Codigo:

Private Sub lF_NumeroExpediente()
'Rutina que obtiene el numero de expediente para las contingencias
Dim lcQuery As String
Dim larsNumExpediente As SqlClient.SqlDataReader
Dim lcComandoExp As SqlClient.SqlCommand
Dim lcTransaccion As SqlClient.SqlTransaction
Dim numExpediente As String
Dim anhoexpcont As Integer
Dim numexpcont As Long
Dim resultado As Integer
Dim fecha As Date

Try
gmcSqlConexion.Open()
lcComandoExp = New SqlClient.SqlCommand
lcTransaccion = gmcSqlConexion.BeginTransaction
lcQuery = "Select VALOR from CONTADORES where NOM_CONTADOR='ID_ARCHIVO'"
lcComandoexp.CommandText = lcQuery
lcComandoExp.Transaction = lcTransaccion
lcComandoExp.Connection = gmcSqlConexion
larsNumExpediente = lcComandoexp.ExecuteReader
If larsNumExpediente.HasRows Then
larsNumExpediente.Read()
larsNumExpediente.Close()
lcQuery = "Update CONTADORES set VALOR='" & numExpediente & "' where NOM_CONTADOR='ID_ARCHIVO'"
lcComandoExp.CommandText = lcQuery
lcComandoExp.Transaction = lcTransaccion
resultado = lcComandoExp.ExecuteNonQuery
lcComandoExp.Transaction.Commit()
Else
MsgBox("Error al asignar numero de expediente. No existe el contador", MsgBoxStyle.OkOnly, "Asignacio de Numero de Expediente")
End If
gmcSqlConexion.Close()
Exit Sub
Catch ex As Exception
lcComandoExp.Transaction.Rollback()
gmcSqlConexion.Close()
MsgBox("Error al dar alta de Archivo," & ex.Message)
larsNumExpediente = Nothing
End Try
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder