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

#16 MAXI
17/09/2004 - 01:42 | Informe spam
sip, solo arma el Store Procedure y desde Access llama a el :-), es
indistinto luego de donde lo haces, pero eso si, arma el Store :-D




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"" escribió en el
mensaje news:03b101c49c41$1ad599f0$
Contestación a Maximiliano D. Accotto:
He estado observado tu reporte, parece fácil, sencillo y
práctico..., pero debo implementarlo con ADO para acceder
desde una base de Datos mdb a la Base de datos SQL Server
(archivo adp), ¿esta alternativa la podría incluir
utilizando esta misma filosofía?...













Hola, perdon no, pero yo escribi hace poco un patron de


esto que esta
publicado en:

http://www.microsoft.com/spanish/ms...mtj.net/vo


ices/art187.asp

Quizas te sea util


Salu2
-


-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
-


-
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Rodrigo Corral [MVP]" escribió


en el mensaje
news:
Interesante lo del articulo. Un patrón para obtener




codigos unicos que no
sean identity es algo que seria muy util. Son tipicas




las tablas de
secuencias de codigos.

Podrias orientarlo exponiendo las soluciones habituales




y erroneas que
solo
funcionan con muy baja concurrencia y luego proponer la




buena solución. En
cuanto lo tengas mandamelo!!!

Y ya por pedir si lo orientas tanto TSQL como a ADO




perfecto!!!

Si necesitas mi colaboración en algo, algun ejemplo de




código o lo que sea
me dices...


Un saludo
Rodrigo Corral González [MVP]

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








Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.748 / Virus Database: 500 - Release Date:


01/09/2004


.

Respuesta Responder a este mensaje
#17 nadura
17/09/2004 - 18:09 | Informe spam
Y esto del store, ¿Como se realiza? nunca he utilizado
este tipo de procedimiento en un proyecto adp. Podrías
indicarmelo, si no te hes mucha molestia, hay algún
reporte de microsoft que lo trate en profundidad.
Gracias por tu atención y paciencia.
Saludos.






sip, solo arma el Store Procedure y desde Access llama a


el :-), es
indistinto luego de donde lo haces, pero eso si, arma el


Store :-D




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

""


escribió en el
mensaje news:03b101c49c41$1ad599f0$
Contestación a Maximiliano D. Accotto:
He estado observado tu reporte, parece fácil, sencillo y
práctico..., pero debo implementarlo con ADO para acceder
desde una base de Datos mdb a la Base de datos SQL Server
(archivo adp), ¿esta alternativa la podría incluir
utilizando esta misma filosofía?...













Hola, perdon no, pero yo escribi hace poco un patron de


esto que esta
publicado en:

http://www.microsoft.com/spanish/ms...d/mtj.net/




vo
ices/art187.asp

Quizas te sea util


Salu2


-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET


-
Nunca consideres el estudio como una obligación sino




como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Rodrigo Corral [MVP]"




escribió
en el mensaje
news:
Interesante lo del articulo. Un patrón para obtener




codigos unicos que no
sean identity es algo que seria muy util. Son tipicas




las tablas de
secuencias de codigos.

Podrias orientarlo exponiendo las soluciones






habituales
y erroneas que
solo
funcionan con muy baja concurrencia y luego proponer






la
buena solución. En
cuanto lo tengas mandamelo!!!

Y ya por pedir si lo orientas tanto TSQL como a ADO




perfecto!!!

Si necesitas mi colaboración en algo, algun ejemplo de




código o lo que sea
me dices...


Un saludo
Rodrigo Corral González [MVP]

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








Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.748 / Virus Database: 500 - Release Date:


01/09/2004


.





.

Respuesta Responder a este mensaje
#18 nadura
17/09/2004 - 18:18 | Informe spam
Hola a Todos.
os agradezco vuestra participación y paciencia. con
referencia a los expuesto por Miguel Egea en el primer
punto(Usa un valor identity), utilizando la tabla de
registros eliminados podría evitar la situación de que
queden saltos en la numeración de los registros de
clientes.

Claro que está por discutir la efectividad ya
mencionada...

en cuanto al segundo lo probaré en estos días, en cuanto
pueda os digo

Gracias por todo.
Buen fin de semana.








Veamos, puedes usar un identity para eso, además si


pones la integridad
referencial (clave primaria) nunca tendrías un


duplicado, como mucho el
segundo podría obtener un error si calculas el máximo


como un Select max,

Además en el caso que planteas lo que quieres es que


inserciones bloqueen
inserciones, pero lo que nos pides es que inserciones


bloqueen tablas, es
radicalmente distinto, fijate que si lo hacemos así, el


jefe de la empresa
no podrá ver su listado de clientes que más compran por


que la tabla de
clientes estará bloqueada para dar de alta nuevos


clientes, puede suponerte
un problema muy grande.

Tu caso tiene un montón de soluciones distintas, te voy


a proponer tres que
funcionan bastante bien, te las pongo en pseudocódigo


(las que merece la
pena el pseudocódigo).

1.- Usa un valor identity. (no es buena idea para


mostrarselo a los clientes
y puedes tener saltos, pero cumple tu requisito)

2.- create un tabla paralela de claves por ejemplo con


la estructura
tabla,id
creaa un procedimiento almacenado con un código


parecido a este..


Declare @mierror int
declare @id int
set @mierror=0


superiro si no no hay id
if @@trancount=0
begin
set @mierror0 -- no hay transaccion
goto salir
update TAbla set @id=id=id+1 where


tabla='tuttalbla'

usalo para el momento de grabar, no muestres


ningún código de
antemano, sino que al fina lde la grabación de tu


clientes muestras un
mensaje diciendo, se ha grabado correctamente la ficha


con código XXXX,.
esta operación dentro de una transacción te serializará


las inserciones
nuevas pero no te penalizará en absoluto las conustas a


clientes

3.- Usa bloqueos de aplicación, puedes mirar en


portalsql.com hay algún
artículo que los explica y pueden servirte para el mismo


propósito.



-
Miguel Egea Gómez
Microsoft SQL-Server MVP
Webmaster de PortalSql.Com
¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?




""


escribió en el
mensaje news:188601c499f1$c0038240$
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


.





.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida