好吧,我有一个web服务,下一个代码在实现中:
procedure Tferreteria.inserpersona(persona:Tpersona);
begin
//insertar persona
dm:=Tconsultas.Create(nil);
with dm.SQLQuery1 do
begin
Close;
SQL.Add('insert into persona (nombreyape, domicilio)values (:nombreyape,:domicilio);');
ParamByName('nombreyape').AsString:=persona.nombreyape;
ParamByName('domicilio').AsString:=persona.domicilio;
ExecSQL();
end;
end;
procedure Tferreteria.insercliente(cliente:Tcliente);
begin
//insertar cliente
with dm.SQLQuery1 do
begin
SQL.Clear;
SQL.Add ('insert into clientes(idcliente,idpersona,cuit,cuil) values (null,(select last_insert_id()),:cuit,:cuil);');
ParamByName('cuit').AsInteger:=cliente.cuit;
ParamByName('cuil').AsInteger:=cliente.cuil;
ExecSQL();
end;
end;
正如您所看到的那样,将2个程序插入到表格角色和客户中。客户有一个列idpersona与参考人物
在按钮点击事件中,我有这段代码
with Persona do
begin
nombreyape:=Form2.Edit1.Text;
domicilio:=Form2.Edit8.Text;
idlocalidad:=StrToInt(Form2.Edit3.Text);
end;
with Cliente do
begin
cuit:=StrToInt(Edit6.Text);
cuil:=StrToInt(Edit7.Text);
end;
//llamar al servicio
GetIferreteria.inserpersona(Persona);
GetIferreteria.insercliente(Cliente);
我得到了这个错误
错误的整数值' aaa'对于第1行的列cuit,
当aaa写在edit1中时,它不符合clientes.cuit,
感谢您的帮助
现在我还有其他问题:
我必须在clientes中插入idpersona,但我必须在telper中插入idpersona,telper是一个能够在电话和拥有这部电话的人之间建立关系的表格。
如果我与其他查询相同,则最后一个插入ID将是来自clientes(idcliente)的id,而不是idpersona。
我能做些什么来让idpersona代表每个我需要使用它的时刻,我的意思是每张桌子。
答案 0 :(得分:1)
我强烈建议您重新编写此代码。特别是因为您正在使用last_insert_id()
(您不需要select
进行检索),所以您应该一起执行这两个语句,最好是在事务中(或者更好,在存储过程中)。 / p>
尝试更像这样的事情:
procedure Tferreteria.inserPersonaUnCliente(persona: Tpersona; cliente: Tcliente);
var
Query: TSQLQuery;
Conn: TSQLConnection;
SQL: TStrings;
Trans: TDBXTransaction;
begin
dm := Tconsultas.Create(nil);
Query := dm.SQLQuery1;
Conn := Query.SQLConnection;
SQL := Query.SQL;
//insertar persona un cliente
Query.Close;
Trans := Conn.BeginTransaction;
try
SQL.BeginUpdate;
try
SQL.Clear;
SQL.Add('insert into persona (nombreyape, domicilio) values (:nombreyape, :domicilio);';
SQL.Add('insert into clientes(idcliente, idpersona, cuit, cuil) values (null, last_insert_id(), :cuit, :cuil);');
finally
SQL.EndUpdate;
end;
Query.ParamByName('nombreyape').AsString := persona.nombreyape;
Query.ParamByName('domicilio').AsString := persona.domicilio;
Query.ParamByName('cuit').AsInteger := cliente.cuit;
Query.ParamByName('cuil').AsInteger := cliente.cuil;
Query.ExecSQL;
Conn.CommitFreeAndNil(Trans);
except
Conn.RollbackFreeAndNil(Trans);
raise;
end;
end;
with Persona do
begin
nombreyape := Form2.Edit1.Text;
domicilio := Form2.Edit8.Text;
idlocalidad := StrToInt(Form2.Edit3.Text);
end;
with Cliente do
begin
cuit := StrToInt(Edit6.Text);
cuil := StrToInt(Edit7.Text);
end;
//llamar al servicio
GetIferreteria.inserPersonaUnCliente(Persona, Cliente);