如何使用DataSnap插入记录

时间:2014-11-14 10:08:16

标签: delphi insert datasnap

在许多教程中,我阅读了如何从datasnap客户端中的数据库中选择数据,例如:完成一个dbgrid。 但我现在需要知道如何插入或更新一行,例如“新客户”。每个人都可以推荐我一本书或教程吗?

除了clientclassesunit之外,我在客户端上的clientdatamodule上有一个sqlconnection。我正在使用插入SQL语句向SQL实现一个SQLQuery,但它不起作用。

另一方面,我在服务器端:

procedure TServerMethods1.nuevocheque(idcliente,numero,cuenta,idbanco : integer; fr,fc, titular:string ;importe:Double;cobrado:Boolean);
var
ucheque:integer;
begin
  with qicheque do
    begin
      Open;
      ParamByName('idcliente').AsInteger:=idcliente;
      ParamByName('numero').AsInteger:=numero;
      ParamByName('fr').AsDate:=StrToDate(fr);
      ParamByName('fc').AsDate:=StrToDate(fc);
      ParamByName('importe').AsFloat:=importe;
      ParamByName('titular').AsString:=titular;
      ParamByName('cobrado').AsBoolean:=cobrado;
      ParamByName('cuenta').AsInteger:=cuenta;

      ExecSQL();

    end;
end;

使用此方法我尝试插入,该语句是组件的SQL属性。

在客户端,我有一个名为“nuevocheque”的TSQLServerMethod:

procedure TForm4.BGuardarClick(Sender: TObject);
var
idcliente,numero,cuenta,idbanco:integer;
titular:string;
cobrado:Boolean;
fr,fc:string;
importe:Double;
begin
  ClientModule1.nuevocheque.Create(nil);
  with ClientModule1.nuevocheque do
  begin

    idcliente:=1;
    numero:=StrToInt(ENumero.Text);
    cuenta:=StrToInt(Ecuenta.Text);
    idbanco:=1;
    titular:=ENombre.Text;
    cobrado:=False;
    importe:=StrToFloat(EMonto.Text);
    fr:=EFechaEmision.Text;
    fc:=EFechacobro.Text;


  end;

end;

但它不起作用。 谢谢你的帮助

3 个答案:

答案 0 :(得分:1)

好吧,我实现了将数据插入到我已经设想的mysql数据库中。

这是delphi中的te代码:

procedure TForm4.BGuardarClick(Sender: TObject);
var

idcliente,numero,cuenta,idbanco:integer;
titular:string;
cobrado:Boolean;
fr,fc:string;
importe:Double;
a:TServerMethods1Client;
interes:Double;
begin
  a:=TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection);


  begin

    idcliente:=Unit3.id;
    numero:=StrToInt(ENumero.Text);
    cuenta:=StrToInt(Ecuenta.Text);
    idbanco:=lcbbanco.KeyValue;
    titular:=ENombre.Text;
    cobrado:=False;
    if (EP.Text<>'') then
       begin
         importe:=StrToFloat(EHC.Text);
       end
       else
        begin
          importe:=StrToFloat(EMonto.Text);
        end;

    fr:=EFechaEmision.Text;
    fc:=EFechacobro.Text;


  end;
   a.nuevocheque(idcliente,numero,cuenta, idbanco,fr,fc,titular,importe,cobrado);
end;

我用SQL组件调用了方法create(),比如M Diwo说我。

我太开心了。感谢所有

答案 1 :(得分:0)

我不知道你使用什么作为数据库连接,为了我自己的方便,我稍微修改了dbGO(变量传递的参数)。
此外,我已经从服务器方法创建了一个函数,像这样可以通知客户端存在问题(查询,连接,...)。这是服务器方法:

//server
function TServerMethods1.NuevoCheque(idcliente, numero, cuenta,
  idbanco: integer; fr, fc, titular: string; importe: Double;
  cobrado: Boolean): Boolean;
begin
  try
    with qicheque, Parameters do
      begin
        Close;
        ParamByName('idcliente').Value:=idcliente;
        ParamByName('numero').Value:=numero;
        ParamByName('fr').Value:=StrToDate(fr);
        ParamByName('fc').Value:=StrToDate(fc);
        ParamByName('importe').Value:=importe;
        ParamByName('titular').Value:=titular;
        ParamByName('cobrado').Value:=cobrado;
        ParamByName('cuenta').Value:=cuenta;
        ExecSQL();
      end;
      Result := true;
  except
    Result := false;
    //raise; <-- uncomment if you want to handle this properly in your code
  end;
end;


对于客户端,我想你生成了一个代理单元,通常会创建一个名为ServerMethods1的对象?
您必须将客户端dbx连接传递给此 - 我这样说是因为我看到您在代码中添加了nil。

// client
procedure TfrmClient.BGuardaClick(Sender: TObject);
var
  sm : TServerMethods1Client; // <-- generated by proxy generator
  idcliente,numero,cuenta,idbanco : integer;
  fr,fc, titular : string ;
  importe : Double;
  cobrado : Boolean;
begin
  sm := TServerMethods1Client.Create(SQL.DBXConnection);
  if sm.nuevocheque(idcliente,numero,cuenta,idbanco, fr,fc, titular, importe, cobrado) then
    // ok
  else
    // error
  sm.Free;
end;


HTH

答案 2 :(得分:0)

您可以使用对远程方法的调用,但他们不会自动更新您的数据感知控件。 Datasnap能够处理它。首先,您需要在客户端上添加/更新/删除数据。它发生在由TClientDataset管理的本地缓存中,即使您发布了&#34; Post&#34;。 当你准备好了,你需要&#34;申请&#34;更改到调用Apply()方法的远程服务器。 当您调用它时,服务器上的提供程序组件会收到一个&#34; delta&#34;记录要从客户端数据集更改,并将自动生成所需的INSERT / UPDATED / DELETE SQL语句。 如果您不喜欢它们,或者您需要执行更复杂的处理,您可以使用提供程序事件自己为每个已更改的记录执行所需操作,然后告诉提供程序您已执行此操作避免自动处理。然后提供商传回&#34; delta&#34;到客户端,用于更新数据感知控件。您还可以修改&#34; delta&#34;在它被传回之前。 在文档中阅读Datasnap架构的说明 - 它是一个多步骤设计,其中有几个组件可以实现多层实现。