Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ADOConnection solo lectura (https://www.clubdelphi.com/foros/showthread.php?t=83673)

jplj 13-07-2013 00:17:17

ADOConnection solo lectura
 
Hola:

Estoy tratando que los datos de una aplicación -almacenados en una DB MSAccess- sólo sean accesibles en modo lectura en función del usuario que acceda.
Todos los procesos sobre las diversas tablas de la base de datos se realizan con componentes ADO, que emplean la misma conexión.
En principo he asignado a Mi_ADOConnection.Mode el valor Read, pero al realizar el primer acceso a una tabla cambia a ShareDenyNone.

Código Delphi [-]
procedure TList_tbl_users.Load(sql: string; Conexion: TADOConnection);
var
  Q: TADOQuery;
  W: Ttbl_users;
begin
  Q:= TADOQuery.Create(nil);
  try
    Q.SQL.Text:= Sql;
    Q.Connection:= Conexion;  ==>  [Al consultar el valor de Conexion.Mode devuelve Read]
    Q.Open;
    Q.First;   ==>  [Al consultar el valor de Conexion.Mode devuelve ShareDenyNone]
    while not Q.Eof do
    begin
      W:= Ttbl_users.Crear(Conexion);
      W.Load(Q.Fields[0].AsInteger);
      Self.Add(W);
      Q.Next;
    end;
  finally
    Q.Free;
  end;
end;

Es el método Open quien lo modifica.

¿Dónde está el error?


Uso:
.- Delphi 7
.- Microsoft.Jet.OLEDB.4.0
.- MSAcces 97

Muchas gracias de antemano.
Un Saludo

TiammatMX 13-07-2013 00:54:37

Permisos y privilegios, ahí tienes tu respuesta. Ahora que si te quieres poner a programar, no hay poder humano ni divino que evite que cambie el modo de lectura, POR QUE EN ÉSO SE BASA EL USO DEL MOTOR DE BASE DE DATOS.

Otra historia es cuando usas una serie de sentencias SQL para añadir, cambiar o eliminar registros.

jplj 13-07-2013 14:11:56

Hola:

Cita:

Ahora que si te quieres poner a programar, no hay poder humano ni divino que evite que cambie el modo de lectura, POR QUE EN ÉSO SE BASA EL USO DEL MOTOR DE BASE DE DATOS.
¿De Microsoft.Jet.OLEDB.4.0, o de todos en general?


Cita:

Otra historia es cuando usas una serie de sentencias SQL para añadir, cambiar o eliminar registros.
Entre mi ignorancia y que ando "espeso", como el día, no logro entender que quieres decir con esta frase.

jplj 14-07-2013 20:39:57

Hola:

He continuado probando, y he conseguido solucionar mi problema :).

En primer lugar he de decir -no lo mencione en el primer post- que todos los accesos a las tablas se realizan con TADOQuery y con TADOCommand.

He comprobado que el valor asignado a ADOConnection.Mode es "irrelevante", no sé cuál es su finalidad.

Sin embargo, el valor asigando en ADOConnection.ConnectionString si que afecta al modo en el que comporta la conexión. Hace lo esperado.

En valor por defecto -Share Deny None- permite la edición.

Cita:

Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=E:\proyectos\proy_inv\exe\db\inv0.mdb;Mode=Share Deny None;Extended Properties= ...
El valor Read, premite leer pero impide la insercción, edición y eliminación.
Cita:

Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=E:\proyectos\proy_inv\exe\db\inv0.mdb;Mode=Read;Extended Properties= ...
Cuando se configura ConnectionSgring de esta forma, TADOQuery y TADOCommand no realizan modicaciones en el estado de la conexión. Cuando se intenta hacer un INSERT, UPDATE o DELETE se genera un error, que nos dice algo así como que se debe utilizar una consulta actualizable.

Un Saludo.


La franja horaria es GMT +2. Ahora son las 18:22:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi