0

我正在使用 fireDAC TFDQuery 在 informix 数据库中插入值,使用下面的代码片段:

with QHeaderQuery do
begin
  if not (Prepared) then
  begin
    {DatabaseName := Sessions.CurrentSession.Databases[0].DatabaseName;
    SessionName := Sessions.CurrentSession.SessionName;}
    Connection := FDManager.Connections[0];
    SQL.Clear;
    SQL.Add('insert into asptheade ( ');
    SQL.Add('theade_trans, theade_store,  theade_register, theade_location, ');
    SQL.Add('theade_date, theade_cashier, theade_type, theade_name, ');
    SQL.Add('theade_salesperson, theade_group, theade_group_disc, ');
    SQL.Add('theade_comm_flag, theade_comm_price, theade_cust_code, ');
    SQL.Add('theade_sub_total, ');
    SQL.Add('theade_tax_total, theade_disc_total, theade_grand_total, ');
    SQL.Add('theade_change_amt, theade_drawertime, theade_posted_date, theade_gratuity) ');
    SQL.Add('values ( :d0, :d1, :s2, :s3, ');
    SQL.Add(' current year to second, :s4, :s5, :s6, ');
    SQL.Add(':s7, :s8, :f9, ');
    SQL.Add(':s10, :s11, :s12, :f13, ');
    SQL.Add(':f14, :f15, :f16, :f17, :f18, :f19, :f20 ) ');
    Prepared := True;
  end;
  {SQL.Add( Format( 'values ( %d, %d, "%s", "%s", ',  }
  Params[0].AsInteger := FTrans;
  Params[1].AsInteger := FStore;
  Params[2].AsString := FRegister;
  Params[3].AsString := FLocation;
  {SQL.Add( Format( ' current, "%s", "%s", "%s", ',    }
  Params[4].AsString := FCashier;
  Params[5].AsString := FTransType;
  Params[6].AsString := FStatementText;
  {SQL.Add( Format( '"%s", "%s", %f, ',}
  Params[7].AsString := FSalesPerson;
  Params[8].AsString := FDiscGroup;
  Params[9].AsFloat := FDiscRate * 100;
  {SQL.Add( Format( '"%s", "%s", "%s", %f, ',}
  Params[10].AsString := FCommFlag;
  Params[11].AsString := FCommPrice;
  Params[12].AsString := FCustCode;
  Params[13].AsFloat := FSubTotal;
  {SQL.Add( Format( '%f, %f, %f, %f ) ',}
  Params[14].AsFloat := FTaxTotal;
  Params[15].AsFloat := FDiscTotal;
  Params[16].AsFloat := FGrandTotal;
  Params[17].AsFloat := FChangeAmt;
  Params[18].AsDateTime := FDrawerTime;
  Params[19].AsDateTime := FServiceDate;
  Params[20].AsFloat := FGratuity;

  Execute;
  FValid := True;
end;
FTrans :=   FDManager.Connections[0].GetLastAutoGenValue('asptheade');
QHeaderQuery.Close;

我得到不支持的功能。我什至尝试了空字符串而不是同样的错误。你能指导我正确使用 GetLastAutoGenValue 吗?我正在使用 dbExpress 网桥驱动程序。

4

3 回答 3

2

GetLastAutoGenValue 支持返回:

  1. 在插入/发布时为所有数据源使用的最后一个自动增量字段值;
  2. 在 ExecSQL / ExecProc 用于本地 FireDAC 驱动程序的最后一个自动增量值;
  3. 本机 FireDAC 驱动程序的序列/生成器的最后一个值。GetLastAutoGenValue 参数是生成器/序列名称。

FireDAC XE5 没有 Informix 的本机驱动程序。因此,Informix 不支持 (2) 和 (3)。您的代码是 INSERT with Execute,因此也不支持 (1)。因此,您将获得“不支持的功能”。

于 2014-04-15T03:42:54.013 回答
2

您可以通过在插入查询之后立即执行以下查询来解决问题:

SELECT DBINFO('sqlca.sqlerrd1') FROM SYSTABLES WHERE tabname = 'systables'
于 2014-04-15T06:00:30.477 回答
2

我在我的存储过程中使用以下查询来解决这个问题:

SELECT DBINFO('sqlca.sqlerrd1') FROM SYSTABLES WHERE tabname = '<tablename>'

并在存储过程中返回相同的值。

于 2014-04-16T12:07:21.263 回答