Acceso exclusivo a la Tabla de la Base de Datos mediante código VBA

13/09/2004 - 03:33 por nadura | Informe spam
Con el siguiente Código mediante ADO puedo conseguir
bloquear un determinado registro de la base de Datos
cuando dos usuarios pretenden acceder a él de forma
simultánea:

Private Sub Command0_Click()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strText As String
Dim strConn As String
Dim iCliente As Integer
Dim iClienteValorCambiado As String

On Error GoTo err_ADO:

iCliente = InputBox("Introduzca el Código de Cliente a
buscar:" & vbNewLine & "Debe Introducir un valor
numerico.")
If Len(iCliente) = 0 Then
Exit Sub
End If

iClienteValorCambiado = InputBox("Introduzca el Valor
nuevo:")
If Len(iClienteValorCambiado) = 0 Then
Exit Sub
End If

strConn = "Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False;Initial
Catalog=Base de Datos SQL Server 2000;Data
Source=WINDOWSXP"
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

cn.Open strConn
rs.Open "Select * from [Tabla de Clientes] WHERE
[C_CLIENTE]= " & iCliente, cn, adOpenStatic,
adLockPessimistic < Bloqueo del Registro con número
de cliente coincidente con el criterio de búsqueda.

MsgBox "Registro bloqueado: " & iCliente

Do Until rs.EOF
rs.Fields("N_CLIENTE").Value =
iClienteValorCambiado
MsgBox "Valor cambiado de " & iClienteValor & "
a " & iClienteValorCambiado
rs.MoveNext
Loop

rs.Close
cn.Close

Exit Sub

err_ADO:

MsgBox "Error: " & Err.Description
Resume Next

End Sub


Cuestión a Plantear: ¿Como debería modificar dicho código
para bloquear toda la Tabla, es decir, permitir a un
usuario concreto abrir la Tabla en modo exclusivo,
impidiendo a otros usuarios acceder a ésta, mientras el
primero esté realizando consultas ó modificaciones en la
misma?

¿Existe algún conversor para pasar código en DAO a ADO?

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral [MVP]
13/09/2004 - 10:58 | Informe spam
No lo he probado, pero añadir WITH TABLOCK a tu SELECT, deberia funcionar.


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#2 Miguel Egea
13/09/2004 - 15:10 | Informe spam
Creo que no le funcionaría por que no tiene transacciones.
Más allá de eso, me parece muy poco recomendable hacer esto. Bloquear una
tabla entera mientras una actualización puede ser un gravísimo problema de
concurrencia, muchísimos procesos pueden quedar bloqueados a la espera (yo
creo que siendo la tabla de clientes colapsarías las BBDD) ya que
permanecerán bloqueos sobre otras tablas esperando a que se libere la de
clientes.
Si nos cuentas cual es el objetivo del bloqueo quizá pudiermos ayudarte.
También le recomiendo a nuestro amigo que se lea todo lo que pueda sobre
bloqueo optimista, bien es cierto que no es lo mismo que un bloqueo
pesimista que existe en la BBDD pero es muy adecuado para la mayoría de las
aplicaciones.


Saludos

Miguel Egea
Microsoft SQL-SERVER MVP
Brigada Anti-Cursores
http://www.portalsql.com

(Quita el online si me tienes que mandar un correo)


"Rodrigo Corral [MVP]" escribió en el mensaje
news:uWpaH$
No lo he probado, pero añadir WITH TABLOCK a tu SELECT, deberia funcionar.


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


Respuesta Responder a este mensaje
#3 Rodrigo Corral [MVP]
13/09/2004 - 15:37 | Informe spam
La documentación no dice nada de que sea necesario tener una transacción

Totalmente de acuerdo en que bloquear una tabla es algo que afecta
radicalmente a la escalabilidad de una aplicación pero...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#4 nadura
14/09/2004 - 02:28 | Informe spam
Hola a Todos.
Os agradezco enormemente vuestras sugerencias, y en este
sentido respondiendo a la cuestión de Miguel egea, éste es
el objetivo del bloqueo:

En una Base de Datos SQL server en el Servidor Principal
donde almaceno los datos de los Clientes(Tabla de
Clientes) con un número de registro consecutivo(Siendo
este clave principal); utilizo mediante ADO acceso a la
misma por dos puestos Clientes,Si los usuarios de estos
dos puestos pretenden crear un nuevo registro de Cliente
al mismo tiempo (Planteo el peor de los casos)podrían
ocasionarse problemas de duplicación de registro y por
tanto error en la signación del campo que es clave
principal.

Por ello para evitarlo, si uno de los usuarios logra
acceder a la tabla de forma exclusiva, realiza un bloqueo
de la misma al otro usuario, recuperando el número de
registro a utilizar para el nuevo cliente, desbloqueando
seguidamente dicha Tabla, para que otro usuario pueda
acceder a ella. Por tanto el bloqueo de dicha tabla es
mínimo, evitando así el error antes mencionado.

¿Utilizando el bloqueo optimista obtengo los mismos
resultados?¿Hay algún reporte técnico donde se exprese la
utilización de este tipo de bloqueos?¿Existe book online
sobre ADO en www.microsoft.com/spain?

He intentado expresarme de la forma más clara y sencilla,
espero que sea suficientemente comprensible.

Gracias por vuestra colaboración










La documentación no dice nada de que sea necesario tener


una transacción

Totalmente de acuerdo en que bloquear una tabla es algo


que afecta
radicalmente a la escalabilidad de una aplicación pero...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


.

Respuesta Responder a este mensaje
#5 nadura
14/09/2004 - 04:18 | Informe spam
En que consiste un WITH TABLOCK. ¿Como añadirlo a la línea
de código?








Hola a Todos.
Os agradezco enormemente vuestras sugerencias, y en este
sentido respondiendo a la cuestión de Miguel egea, éste


es
el objetivo del bloqueo:

En una Base de Datos SQL server en el Servidor Principal
donde almaceno los datos de los Clientes(Tabla de
Clientes) con un número de registro consecutivo(Siendo
este clave principal); utilizo mediante ADO acceso a la
misma por dos puestos Clientes,Si los usuarios de estos
dos puestos pretenden crear un nuevo registro de Cliente
al mismo tiempo (Planteo el peor de los casos)podrían
ocasionarse problemas de duplicación de registro y por
tanto error en la signación del campo que es clave
principal.

Por ello para evitarlo, si uno de los usuarios logra
acceder a la tabla de forma exclusiva, realiza un bloqueo
de la misma al otro usuario, recuperando el número de
registro a utilizar para el nuevo cliente, desbloqueando
seguidamente dicha Tabla, para que otro usuario pueda
acceder a ella. Por tanto el bloqueo de dicha tabla es
mínimo, evitando así el error antes mencionado.

¿Utilizando el bloqueo optimista obtengo los mismos
resultados?¿Hay algún reporte técnico donde se exprese la
utilización de este tipo de bloqueos?¿Existe book online
sobre ADO en www.microsoft.com/spain?

He intentado expresarme de la forma más clara y sencilla,
espero que sea suficientemente comprensible.

Gracias por vuestra colaboración










La documentación no dice nada de que sea necesario tener


una transacción

Totalmente de acuerdo en que bloquear una tabla es algo


que afecta
radicalmente a la escalabilidad de una aplicación pero...


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


.



.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida