PDA

Ver la Versión Completa : Dudas y misterios en componentes ADO


Jere_84
31-10-2013, 14:43:44
Buenos dias, Me ha surgido una inquietud con estos componentes que me parecen excelentes por cierto. Tengo un ADODataSet conectado a una DBGrid todo anda perfecto hasta que.. la DBGrid hace el post de manera automática lo que hace que cada registro se grabe en la base de datos (MS SQL Server 2008) pero lo que yo necesito es que no se graben. Digamos que el post no grabe hasta que yo se lo indique al DataSet.
En la ayuda de delphi dice lo siguiente:


TDataSet implements a virtual method to write a modified record to the database or change log. Dataset methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.

Different types of datasets handle posting differently:

BDE-enabled datasets post records directly to the database server unless CachedUpdates is true. When caching updates, BDE-enabled datasets post records to an internal change log until they are applied to the database by calling ApplyUpdates.


En español:


TDataSet implementa un método virtual para escribir un registro modificado a la base de datos o registro de cambios. Métodos de conjuntos de datos que cambian el estado conjunto de datos , como Edit, Insert o Append , o que se mueven de un registro a otro , tales como First, Last , Next y Prior llamar automáticamente a Post.

Los diferentes tipos de conjuntos de datos manejan la publicación de otra manera:

Conjuntos de datos BDE habilitados para colocar los registros directamente al servidor de base de datos a menos CachedUpdates es True. Cuando el almacenamiento en caché actualizaciones , conjuntos de datos BDE - habilitados Publicación de registros a un registro de cambio interno hasta que se aplican a la base de datos llamando ApplyUpdates.


Busque la propiedad CachedUpdates en el TADODataSet y no esta, al igual que ApplyUpdates. :confused:

Cual es el problema?

Gracias.

ecfisa
31-10-2013, 15:52:48
Hola Jere_84.

Si no recuerdo mal, tenes que poner la propiedad LockType igual a ltBatchOptimistic y luego usar el método UpdateBatch para hacer efectivos los cambios.

Por ejemplo:

procedure TForm.FormCreate(Sender: TObject);
begin
...
with ADODataSet1 do
begin
LockType := ltBatchOptimistic;
Open;
end;
end;

procedure TForm.btnGuardarClick(Sender: TObject);
begin
...
ADODataSet1.UpdateBatch(arAll);
end;


Saludos :)

orodriguezca
01-11-2013, 21:09:31
La solución propuesta por ecfisa con toda seguridad va a funcionar, pero cuando tratamos de realizar cosas un poco más sofisticadas con los datos las capacidades "batch" de los componentes ADO pueden resultar algo limitadas comparado con lo que se podía hacer con los componentes BDE. Yo, sin pensarlo mucho, me apoyaría en la pareja TClientDataSet - TDataSetProvider para lograr los resultados que quiere Jere_84.


Saludos,

Jere_84
01-11-2013, 21:20:07
Muchas gracias ecfisa, anduvo perfecto, lo probé y funciona de esa manera. No creo que lo componentes ADO sean limitados me parece que utilizan internamente librerías del mismo sistema windows o no es as? creo que son la mejor opción cuando uno trabaja con SQL Server. Utilice también los TClientDataSet en una aplicación datasnap y son muy buenos.

Saludos cordiales.