如何使用结果与Query处理ADO查询而没有结果?

Fra*_*anz 2 sql sql-server delphi ado

我使用MSSQL和ADO运行各种SQL语句.

代码序列如下所示:

aADOQuery.Active := False;
aADOQuery.SQL.Text := ' MY SQL STATEMENT ';
aADOQuery.ExecSQL;
aADOQuery.Active := True;
Run Code Online (Sandbox Code Playgroud)

如果SQL返回结果为空,则最后一条语句失败.如何检查这种情况以避免运行时错误?

注意:SQL语句来自用户键入SQL的备忘录.

kob*_*bik 8

如果您的查询返回记录集(SELECT报表),你应该使用ExecSQL,而只是aADOQuery.OpenActive := True.

对于不返回记录集例如查询INSERT/ UPDATE/ DELETE,使用ExecSQL.在大多数情况下,您将aADOQuery.RowsAffected通过查询返回.

您应该使用的其他SQL语句ExecSQLCREATE/ ALTER/ DROP/ EXECetc ...(RowsAffected在这种情况下不返回)

如果查询不返回游标的数据(如INSERT表),试图Open或设置这样TDataSetActive会失败.


您可以使用ADOConnection.Execute而不是TADOQuery执行命令文本,然后检查是否有有效的Recordset返回ADOConnection.在ADOConnection.OnExecuteComplete你可以做这样的事情:

procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
  RecordsAffected: Integer; const Error: Error;
  var EventStatus: TEventStatus; const Command: _Command;
  const Recordset: _Recordset);
begin
  // check for errors
  if Assigned(Error) then
  begin        
    Memo1.Lines.Add('Error: ' + Error.Description);
  end;
  // check for a valid recordset
  if Assigned(Recordset) then
  begin
    MyDataSet.Recordset := Recordset; // MyDataSet is TADODataSet
  end;
  // check for affected rows
  if RecordsAffected >= 0 then
    Memo1.Lines.Add('Records affected: ' + IntToStr(RecordsAffected))
  else
    Memo1.Lines.Add('Record count: ' + IntToStr(MyDataSet.RecordCount));
end;
Run Code Online (Sandbox Code Playgroud)