Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Grabar datos definitivos con ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=92187)

LIGERO 21-08-2017 14:50:03

Grabar datos definitivos con ClientDataSet
 
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 19: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:
Saludos :)

LIGERO 22-08-2017 12: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

Código Delphi [-]
 if (ClientDataSet1.ChangeCount > 0) then
        ClientDataSet1.ApplyUpdates(-1);


que es donde da el error.

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


Código Delphi [-]
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 12:41:12

Estoy un poquito perdido y no consigo solucionar el problema.
Alguien me puede ayudar?
Gracias

LIGERO 24-08-2017 12:56:14

Mejor estrategia para manipular bases de datos
 
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 13:44:31

He unido el hilo que has creado con este porque es el mismo asunto.
Saludos.

LIGERO 25-08-2017 12: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.

Código:

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

Código:

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.


La franja horaria es GMT +2. Ahora son las 17:36:24.

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