3

我正在使用 TADOQuery 组件执行 SQL UPDATE 语句,并希望检查已更新的行数。UPDATE 语句执行良好,并且相应地修改了行,但 .RowsAffected 属性始终返回 -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。

4

3 回答 3

3

抱歉伙计们,感谢您的所有帮助,但我已经意识到问题所在。键入示例代码片段时,我未能将我实际更改数据库作为查询的一部分包含在 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);

谢谢

于 2012-10-08T11:16:22.537 回答
1

使用 TADOCommand 并像这样调用它:

var
  AffectedRows: Integer;
begin
  adoUpdateCommand.Execute(AffectedRows, EmptyParam);
于 2012-10-08T10:12:06.650 回答
0

一种可能性是这样的:

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;

如果您有更多的语句,您可以将 RowCounts 存储在一个临时表中,最后通过选择发布该临时表。

BTW TADOQuery.ExecSQL 是一个函数并返回受影响的行数。所以你的代码可以更紧凑

blnUpdatedOK := ( adoUpdateQuery.ExecSQL > 0 );
于 2012-10-14T11:52:25.527 回答