【问题标题】:Delphi XE 3 LiveBindings AutoInc SQL ServerDelphi XE 3 LiveBindings AutoInc SQL Server
【发布时间】:2012-08-31 14:04:26
【问题描述】:

我有一个带有 LiveBindings 到 SQL Server 的 Delphi XE3 Firemonkey 应用程序。我可以连接并查看网格上的所有数据。我有一个字段(“id”),它是 SQL(通常称为 AutoInc)上的“身份字段”。

当我尝试添加记录时,我得到“字段 'id' 必须有一个值。”

过去,解决此问题的方法是关闭必填字段布尔值。 (例如,使用 DBISAM,您可以使数据库中的字段本身不需要,数据库引擎会在它到达那里时将其填充,但您不能在 MSSQL 中设置不需要的标识字段。)

我已经关闭了对 TField 本身的要求,但这没有任何效果。

【问题讨论】:

标签: sql-server delphi firemonkey livebindings delphi-xe3


【解决方案1】:

我的申请遇到了同样的问题。解决方案有点棘手。首先,您必须将 IDENTITY_INSERT 设置为 ON。

procedure TdmUnit1.Identity(Table: string; OnOff: boolean);
var s: string;
begin
  if OnOff = true then
    s := 'ON'
  else
    s := 'OFF';
  s := 'SET IDENTITY_INSERT ' + '[dbo].[' + Table + '] ' + s;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add(s);
  SQLQuery1.ExecSQL;
end;

然后你必须在你的表中寻找最高的索引。您可以通过 OnNewRecord-Event 实现这一点:

procedure TdmUnit1.ClientDataSet1NewRecord(DataSet: TDataSet);
var
  s: string;
  i: integer;
begin
  s := 'SELECT IDENT_CURRENT(''AnyTable'')';
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add(s);
  SQLQuery1.ExecSQL;
  SQLQuery1.Active := true;
  i := SQLQuery1.Fields[0].AsInteger;
  ClientDataSet1.FieldByName('DB_IDX').AsInteger := i+1;
  SQLQuery1.Active := false;
end;

在 ApplyUpdates(0) 之后,您必须关闭 IDENTITY_INSERT。

【讨论】:

  • 抱歉,刚看到这个。我只是为这个应用程序选择了传统方法,但下次有机会我会尝试一下。
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 2017-07-04
  • 2017-10-24
  • 2022-11-20
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多