首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi XE 3 LiveBindings AutoInc SQL Server

Delphi XE 3 LiveBindings AutoInc SQL Server
EN

Stack Overflow用户
提问于 2012-09-07 01:30:24
回答 1查看 635关注 0票数 0

我有一个德尔福与LiveBindings的XE3火猴应用程序到SQL Server。我可以连接并查看网格上的所有数据。我有一个字段("id"),它是SQL上的“标识字段”(通常称为AutoInc)。

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

在过去,解决这个问题的方法是关闭必需的boolean字段。(例如,使用DBISAM时,您可以使数据库本身中的字段不是必需的,并在数据库引擎到达数据库时填充该字段,但是您不能在MSSQL中使标识字段不是必需的。)

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

EN

回答 1

Stack Overflow用户

发布于 2012-11-06 19:32:05

我的应用程序也遇到了同样的问题。这个问题的解决方案有点棘手。首先,您必须将IDENTITY_INSERT设置为ON。

代码语言:javascript
复制
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实现:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12305384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档