使用DBExpress和Delphi XE執行query bellow時遇到問題。我需要從執行的查詢中獲取最後一個身份標識:如果執行帶返回值的SQL語句,則不返回查詢遊標
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;
而且總是得到空值,也許是因爲不同的會話。 對不起,我英語不好,並提前感謝任何幫助。
更新: 如果我們使用@@標識它的工作原理:
SQL.Add('Insert into SampleTable(uomname) values(' + Quotedstr('bag') +')';
ExecSQL;
SQL.Clear;
SQL.Add('Select @@Identity');
Open;
Result:= Fields[0].AsInteger;
但是,有問題,SQLServer的說,如果有被解僱(插入)上表中的觸發器,返回值是觸發器插入的表的最後一個ID。
使用存儲過程,會讓你的生活更輕鬆。 – whosrdaddy 2014-10-20 12:13:08