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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.