在许多教程中,我阅读了如何从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;
但它不起作用。 谢谢你的帮助
答案 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架构的说明 - 它是一个多步骤设计,其中有几个组件可以实现多层实现。