PDA

Ver la Versión Completa : Grabar datos definitivos con ClientDataSet


LIGERO
21-08-2017, 13:50:03
Buenas:

Estoy creando una pequeña aplicación con ClientDataSet y DataSetProvider.

Lo que hago es acceder a una tabla, posicionarme y cambiar la la imagen en un dbimage.

Hasta ahí todo bien.

Cargo la imagen jpg y aplico ClientDataSet1.Post

La imagen se ve en el DBImage.

El problema es que no se queda grabada en la base de datos cuando cierro el programa.

He probado con ClientDataSet1.ApplYUpdates(-1) pero me muestra el error "no se puede crear una nueva transaccion se excedio la capacidad"

¿Donde está el problema?

Muchas gracias.

ecfisa
21-08-2017, 18:18:16
Hola.

No especificas con que DB ni la versión de Delphi con que estas trabajando pero revisa si este enlace, que trata sobre el mismo error, te aporta la solución:

ERROR: Se excedió la capacidad de transacciones (http://trabajandocondelphixe.blogspot.com.ar/2012/08/error-se-excedio-la-capacidad-de.html)


Saludos :)

LIGERO
22-08-2017, 11:25:08
Buenas Ecfisa.

Gracias por contestar
Sigo con el mismo problema.
Mi DB es SQLServer 2008 y mi delphi EX3.

Tengo un formulario sencillo con dos TDBEdit, un TDBimage, con datos del registro, un Edit donde pongo la referencia del artículo y dos botones, uno para buscar el artículo a través del parámetro REFPROVEEDOR y otro para cargar una imagen jpg en el TDBImage.
Hasta ahí todo bien hasta que ejecutamos la sentencia


if (ClientDataSet1.ChangeCount > 0) then
ClientDataSet1.ApplyUpdates(-1);



que es donde da el error.

Adjunto código por si se ve algo extraño



unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DBXMSSQL, Data.FMTBcd,
Vcl.ExtCtrls, Vcl.DBCtrls, Data.DB, Data.SqlExpr, Datasnap.DBClient,
Datasnap.Provider, Vcl.StdCtrls, Vcl.Mask, Vcl.ExtDlgs, jpeg;

type
TForm1 = class(TForm)
SQLConnection1: TSQLConnection;
SQLTable2: TSQLTable;
DBImage1: TDBImage;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
ClientDataSet1: TClientDataSet;
DataSetProvider1: TDataSetProvider;
Button1: TButton;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
OpenPictureDialog1: TOpenPictureDialog;
Button2: TButton;
SQLQuery1: TSQLQuery;
Edit1: TEdit;
SQLDataSet1: TSQLDataSet;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


function ConvertJPG2BMP(FileName:String):TBitmap;
var
pic:TPicture;
begin
pic := TPicture.Create;
pic.LoadFromFile(FileName);
result:=TBitmap.create;
result.Assign(pic.Graphic);
pic.Free;
end;

(*
function ConvertBMP2JPG(BMPImage:TBitMap, FileName:String, CompQual:Integer):
var
Jpg:Tjpegimage;
begin
Jpg:=TJpegImage.Create;
Jpg.CompressionQuality:=CompQual;
result.Jpg.Assign(BMPImage); //Here assign the bitmap.image and change the function at top.
Jpg.SaveToFile(FielName);
Jpg.free;
end;
*)

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
begin
if (ANSIUpperCase(ExtractFileExt(OpenPictureDialog1.FileName)) = '.JPG')
or
(ANSIUpperCase(ExtractFileExt(OpenPictureDialog1.FileName)) = '.JPEG') then
begin
if not (ClientDataSet1.State = dsInsert) then
ClientDataSet1.Edit;
dbImage1.Picture.Bitmap := ConvertJPG2BMP(OpenPictureDialog1.FileName );
end
else
begin
if not (ClientDataSet1.State = dsInsert) then
ClientDataSet1.Edit;
dbImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
ClientDataSet1.Post;

if (ClientDataSet1.ChangeCount > 0) then
ClientDataSet1.ApplyUpdates(-1);

end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
SQLQuery1.Close;
ClientDataSet1.Active:=false;
SQLQuery1.Params.ParamByName('REFPROVEEDOR').AsString:=UpperCase(Edit1.Text);
ClientDataSet1.Active:=true;
SQLQuery1.Open;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
SQLConnection1.AutoClone:=true;
end;

end.

LIGERO
24-08-2017, 11:41:12
Estoy un poquito perdido y no consigo solucionar el problema.
Alguien me puede ayudar?
Gracias

LIGERO
24-08-2017, 11:56:14
Buenos días:

Me gustaría preguntar a ver que pensáis vosotros sobre cual es la mejor estrategia a la hora de conectar con una base de datos como MSSQL.

Actualmente utilizo XE3.

Para las conexiones y manejo de datos, utilizo SQLConnection, SQLQuery, DataSetProvider, ClientDataSet.

Llevo tiempo sin programar y no sé si esta es la mejor estrategia ya que estoy teniendo problemas a la hora de grabar los datos en el servidor SQL.

En concreto con una imagen que grabo en un TDBImage y que a la hora de hacer ClientDataSet1.ApplyUpdates(-1) me da el error de "no se puede crear una nueva transacción, se excedió la capacidad"

¿Alguien sabe cual puede ser el fallo?

Muchas gracias.

Casimiro Notevi
24-08-2017, 12:44:31
He unido el hilo que has creado con este porque es el mismo asunto.
Saludos.

LIGERO
25-08-2017, 11:15:38
He reestructurado un poco el diseño, no por nada sino por dejarlo todo mas ordenado.
He creado un DataModule y en el procedimiento donde aplico cambios he cerrado y abierto conexión.


procedure TDM.Aplicar;
begin
SQLConnection1.Close;
SQLConnection1.Open;
if not (ClientDataSet1.State = dsInsert) then
ClientDataSet1.Edit;
ClientDataSet1.Post;
if (ClientDataSet1.ChangeCount > 0) then
ClientDataSet1.ApplyUpdates(-1);
ClientDataSet1.Close;
ClientDataSet1.Open;
end;


Primero localizo el registro y lo muestro.
A partir de ahí, busco la imagen y la cargo en el dbimage


procedure TForm1.CargarImageClick(Sender: TObject);
begin
IrARegistroClick(Sender);
if OpenPictureDialog1.Execute then
begin
if not (DM.ClientDataSet1.State = dsInsert) then
DM.ClientDataSet1.Edit;

if (ANSIUpperCase(ExtractFileExt(OpenPictureDialog1.FileName)) = '.JPG')
or (ANSIUpperCase(ExtractFileExt(OpenPictureDialog1.FileName)) = '.JPEG') then

dbImage1.Picture.Bitmap := ConvertJPG2BMP(OpenPictureDialog1.FileName )

else
dbImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
end;




Y ahora ya si puedo aplicar los cambios sin que se produzca el error
Gracias a los que habéis contestado o seguido este hilo.
Lo doy por cerrado.