【发布时间】:2014-10-20 02:16:22
【问题描述】:
我在使用 DBExpress 和 Delphi XE 执行以下查询时遇到问题。我需要从执行的查询中获取最后一个身份 ID:
function TServerDBUtils.ExecuteQueryWithIdentity(ASQLConn: TSQLConnection): Integer;
var
newSQLQuery: TSQLQuery;
begin
Result := -1;
newSQLQuery := TSQLQuery.Create(nil);
try
with newSQLQuery do
begin
SQLConnection := ASQLConn;
SQL.Clear;
SQL.Add('Insert into SampleTable(uomname) values(' + Quotedstr('bag') +')';
SQL.Add('Select Scope_Identity()');
Open;
Result:= Fields[0].AsInteger;
end;
finally
FreeAndNil(newSQLQuery);
end;
end;
我收到错误“光标未返回查询”。我以前使用过同样的方法,使用 FireDac 和 Delphi XE5 并且没有错误。不,我想知道在 DBExpress 中是否不允许“开放”做这样的事情。我应该使用什么方法? (我们必须在我们的项目中使用 DBExpress) 我试过这个:
function TServerDBUtils.ExecuteQueryWithIdentity(ASQLConn: TSQLConnection): Integer;
var
newSQLQuery: TSQLQuery;
begin
Result := -1;
newSQLQuery := TSQLQuery.Create(nil);
try
with newSQLQuery do
begin
SQLConnection := ASQLConn;
SQL.Clear;
SQL.Add('Insert into SampleTable(uomname) values(' + Quotedstr('bag') +')';
ExecSQL;
SQL.Clear;
SQL.Add('Select Scope_Identity()');
Open;
Result:= Fields[0].AsInteger;
end;
finally
FreeAndNil(newSQLQuery);
end;
end;
而且总是得到空值,可能是因为不同的会话。 抱歉我的英语不好,提前感谢您的帮助。
更新: 如果我们使用 @@identity 就可以了:
SQL.Add('Insert into SampleTable(uomname) values(' + Quotedstr('bag') +')';
ExecSQL;
SQL.Clear;
SQL.Add('Select @@Identity');
Open;
Result:= Fields[0].AsInteger;
但是,正如 SQLServer 所说,如果在该表上触发了触发器(在插入时),则返回值是插入触发器的表的最后一个 ID。
【问题讨论】:
-
使用存储过程,会让你的生活更轻松。
标签: sql-server delphi dbexpress