Bloquear registros

14/08/2004 - 17:30 por Samper Ricardo | Informe spam
Saludos
Tengo una base de datos en access y necesito bloquear un registro para que
cuando un usuario lo accesa nadie mas lo pueda accesar, alguien a hecho algo
parecido.

Gracias.

Preguntas similare

Leer las respuestas

#1 Carlos Durán Urenda
14/08/2004 - 18:52 | Informe spam
hola Ricardo

Segun lo que yo se, para trabajar en red, ADO .Net utiliza un modo
desconectado (modelo optimista), es decir, lees los datos y los colocas en
un dataset, pero una vez llenado el dataset, te desconectas de la fuente de
datos, esto debido a que normalmente el usuario se toma su tiempo durante la
edicion de datos, mantener la conexion abierta durante ese tiempo resulta
costoso para el servidor, de forma que el DataSet es un almacen de datos del
lado del usuario, donde este puede insertar, modificar y eliminar registros,
pero dichos cambios no se reflejan en el origen de datos hasta que se
ejecuta el Método Update del adaptador de datos, en ese momento se vuelve a
abrir la conexion y se intenta acutalizar el origen de datos.

Como se trabaja en modo desconectado es posible que mientras el usuario
editaba ciertos registros otro(s) usuario pudo haber accedido a el mismo
registro y modificarlo, eliminarlo o agregar un registro con el mismo campo
llave, entonces se produce un conflicto de actualizacion por la concurrencia
de varios usuarios, el segundo usuario que intente actualizar recibira un
error.

Tu codigo debe ser capaz de detectar tales conflictos y si es posible
solucionarlos (por ejemplo si ambos usuarios capturaron un nuevo registro
con exactamente la misma informacion, no seria necesario notificar del
error) e informar al usuario que registros fallaron en su actualizacion y
cuales fueron las causas.

Ahora bien, posiblemente efectues un proceso automatico que edite ciertos
datos, en cuyo caso seria conventiente trabajar en modo conectado, podrias
usar un campo en la base de datos que indique si el registro esta bloqueado,
y en la clausula SELECT que utilizan los demas procesos de edicion
establecer una condicion WHERE [Bloqueado] = False.

Te recomiendo consigas un libro que te guie en esto, a mi me han servido
estos dos libros

Programacion Avanzada con Microsoft Visual Basic.Net, de Francesco Balena,
Microsoft Press
y
Bases de Datos Con Microsoft Visaul Basic .Net de Francisco Charte Ojeda,
Ed. Anaya

tambien puesdes buscar articulos en la Red sobre ADO .Net

Saludos
Carlos Durán

"Samper Ricardo" escribió en el mensaje
news:
Saludos
Tengo una base de datos en access y necesito bloquear un registro para que
cuando un usuario lo accesa nadie mas lo pueda accesar, alguien a hecho


algo
parecido.

Gracias.


Respuesta Responder a este mensaje
#2 fco
15/08/2004 - 02:19 | Informe spam
El proceso de bloqueo de registros a nivel de base de
datos a nivel de access, sql server y hasta db2 son muy
pobres y limitados, porque en algunos casos tienes que
capturar el error y lo que es peor en db2 de as/400 la
pantalla se bloquea... Asi que te aconsejo que lo mejor
que puedas hacer es crear una tabla de bloqueos tipo
semaforo, donde ademas le configuras el tiempo de bloqueo
en minutos por ejemplo, de modo que cuando ya utilizaste
el registro lo eliminas de la tabla de bloqueos.

yo tengo una así:
TABLA_BLOQUEOS

USUARIO - TABLA - REGISTRO - HORA_BLOQUEO - ID_PC -
ID_SESION


Entonces antes de bloquear un registro presunto si existe
un registro de la "tabla" en la de BLOQUEOS y que ademas
este dentro del tiempo de bloqueo (unos 5 minutos).

Ademas esto te sirve porque la idea es trabajar con los
datos desconectados.


Saludos
Tengo una base de datos en access y necesito bloquear un


registro para que
cuando un usuario lo accesa nadie mas lo pueda accesar,


alguien a hecho algo
parecido.

Gracias.


.

Respuesta Responder a este mensaje
#3 Luis Miguel Cisneros L.
15/08/2004 - 02:23 | Informe spam
Hola!

Puedes trabajar con transacciones y asi bloqueas los registros.

Es verdad lo que dice Carlos, pero si trabajas con DataSet, puedes trabajar
con OLEDBConnection, OleDbDataReader y OleDbCommand.

Investiga sobre transacciones en ADO.NET y encontraras la respuesta a tu
pregunta.

Saludos

Luis Cisneros
"Samper Ricardo" wrote in message
news:
Saludos
Tengo una base de datos en access y necesito bloquear un registro para que
cuando un usuario lo accesa nadie mas lo pueda accesar, alguien a hecho


algo
parecido.

Gracias.


Respuesta Responder a este mensaje
#4 Leonardo Azpurua
17/08/2004 - 03:48 | Informe spam
"fco" escribió en el mensaje
news:65c301c4825d$915ae880$
El proceso de bloqueo de registros a nivel de base de
datos a nivel de access, sql server y hasta db2 son muy
pobres y limitados, porque en algunos casos tienes que
capturar el error y lo que es peor en db2 de as/400 la
pantalla se bloquea... Asi que te aconsejo que lo mejor
que puedas hacer es crear una tabla de bloqueos tipo
semaforo, donde ademas le configuras el tiempo de bloqueo
en minutos por ejemplo, de modo que cuando ya utilizaste
el registro lo eliminas de la tabla de bloqueos.

yo tengo una así:
TABLA_BLOQUEOS

USUARIO - TABLA - REGISTRO - HORA_BLOQUEO - ID_PC -
ID_SESION


Entonces antes de bloquear un registro presunto si existe
un registro de la "tabla" en la de BLOQUEOS y que ademas
este dentro del tiempo de bloqueo (unos 5 minutos).

Ademas esto te sirve porque la idea es trabajar con los
datos desconectados.


Hola.

En realidad, los registros deben bloquearse durante intervalos de tiempo tan
cortos como sea posible. Alguna vez utilicé la técnica que describes (aunque
con mucha menos sofisticación) y los problemas pueden ser espantosos.

Mi experiencia en VB.NET ha sido con SQL Server y las clases de sqlClient.
En VB6 trabajé con Access, y la única necesidad efectiva de bloquear que
tuve fue con los registros donde almacenaba el próximo número de documento.
La aplicación comenzó a construirse en tiempos de Access 97 (Jet 3.5), que
soportaba mal los campos autonuméricos, y usaba DAO. Recientemente la migré
a ADO, y este bloqueo (el único explicito en toda la aplicación) era algo
como esto:

Set rs = New Recordset
rs.CursorLocation = adUseServer
rs.Open "SELECT * FROM Contadores", dbHandle, adOpenStatic,
adLockPessimistic, adCmdText
rs.Fields("Operacion").Value = rs.Fields("Operacion").Value + 1
...

Al especificar bloqueos pesimistas el registro se bloquea al momento de
entrar en modo de edición (cuando cualquiera de sus campos ha cambiado).
Operación es un registro "artificial" (no es utilizado por ningun componente
de ninguno de los sistemas).

Posteriormente se incrementa un campo con el número del próximo de
alguno de los tipos de documentos que maneja el sistema, se actualiza la
fila y se libera el bloqueo. Si hubiera podido disponer de campos
autonuméricos confiables y de algún mecanismo para obtener el valor
correspondiente a la columna autonumerica del registro recien insertado, no
habría tenido que recurrir a ninguno de estos artilugios.

Para todos los procesos adicionales, empleaba instrucciones SQL en
contextos de transacción (eso es lo mismo que hago con el cliente SQL, e
imagino que parecido a lo que haría con Access).

Cuando escribes: UPDATE Articulos SET Existencia = Existencia +
@Variacion

la existencia se actualizará correctamente, independientemente de su valor
original. Para este tipo de actualizaciones puedes utilizar objetos
OleDBCommand.

Lo unico que debes prever (pero eso tienes que hacerlo tambien si
utilizas cualquier mecanismo externo, como el que describes: no puedes -o no
deberías al menos- suponer como cierto que nadie ha alterado el contenido de
la BD ignorando tu protocolo de bloqueos por postas) es que un registro haya
sido eliminado (esto debería causar la reversion -RollBack- inmediata de la
transacción en curso y la cancelación del proceso, con una advertencia al
usuaroi), o que una actualización produzca un resultado indeseado (por
ejemplo, que la existencia resulte en un valor negativo).

Pero por lo general basta con iniciar una Transacción y realizar
cualquier actualización para que el registro modificado (y todos aquellos
almacenados en la misma página física del archivo de BD) queden
automáticamente bloqueados.

Haz algunas pruebas con objetos de la clase oledbCommand.

Salud!

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