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的备忘录.
如果您的查询返回记录集(SELECT报表),你应该不使用ExecSQL,而只是aADOQuery.Open或Active := True.
对于不返回记录集例如查询INSERT/ UPDATE/ DELETE,使用ExecSQL.在大多数情况下,您将aADOQuery.RowsAffected通过查询返回.
您应该使用的其他SQL语句ExecSQL是CREATE/ ALTER/ DROP/ EXECetc ...(RowsAffected在这种情况下不返回)
如果查询不返回游标的数据(如INSERT表),试图Open或设置这样TDataSet到Active会失败.
您可以使用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)