我正在使用 TADOQuery 组件执行 SQL UPDATE 语句,并希望检查已更新的行数。 UPDATE 语句执行正常,行也相应修改,但 .受影响的行属性始终返回 -1。 文档指出 -1 表示语句错误,但正如我所说,它执行正常。 我尝试在语句前面加上 SET NOCOUNT OFF,但这没有区别。 我的代码如下:
var
adoUpdateQuery: TADOQuery;
blnUpdatedOK: Boolean;
begin
adoUpdateQuery := TADOQuery.Create(nil);
adoUpdateQuery.DisableControls;
adoUpdateQuery.Connection := adcMiddleTierDB;
adoUpdateQuery.ExecuteOptions := [eoExecuteNoRecords];
adoUpdateQuery.SQL.Text := 'UPDATE MyTable SET Status = 1 WHERE Status = 0';
try
adoUpdateQuery.ExecSQL;
blnUpdatedOK := (adoUpdateQuery.RowsAffected > 0);
我正在使用Delphi XE2,连接到MS SQL Server 2008R2。
抱歉,伙计们,感谢您的所有帮助,但我已经意识到问题所在。 键入示例代码片段时,我未能包含在 SQL 中,我实际上正在更改数据库作为查询的一部分。 SQL应该显示:
USE MyDatabase; UPDATE MyTable SET Status = 1 WHERE Status = 0
事实证明,USE 命令阻止 RowsAffected 在同一语句中工作(停止它在 TADOQuery 和 TADOCommand 中工作)。 我现在已经通过更改我的代码解决了这个问题,如下所示:
try
// Need to change database in separate SQL query in order for RowsAffected to work
adoUpdateQuery.SQL.Text := 'USE MyDatabase;';
adoUpdateQuery.ExecSQL;
adoUpdateQuery.SQL.Text := 'UPDATE MyTable SET Status = 1 WHERE Status = 0';
adoUpdateQuery.ExecSQL;
blnUpdatedOK := (adoUpdateQuery.RowsAffected > 0);
谢谢
使用 TADOCommand 并像这样调用它:
var
AffectedRows: Integer;
begin
adoUpdateCommand.Execute(AffectedRows, EmptyParam);
一种可能性是这样的:
adoUpdateQuery.SQL.Add( 'USE MyDatabase;' );
adoUpdateQuery.SQL.Add( 'UPDATE MyTable SET Status = 1 WHERE Status = 0;' );
adoUpdateQuery.SQL.Add( 'SELECT @@rowcount;' );
adoUpdateQuery.Open;
try
LRowCount := adoQuery.Fields[0].AsInteger;
finally
adoUpdateQuery.Close;
end;
如果有更多语句,可以将 RowCount 存储在临时表中,最后使用选择发布临时表。
顺便说一句,TADOQuery.ExecSQL是一个函数,返回受影响的行数。因此,您的代码可以更加紧凑
blnUpdatedOK := ( adoUpdateQuery.ExecSQL > 0 );