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);

MS SQL Server 2008R2 に接続している Delphi XE2 を使用しています。

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

1つの可能性は次のようなものです:

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をtemptableに格納し、最後にselectを使用してtemptableを公開できます。

ところで、TADOQuery.ExecSQLは関数であり、影響を受ける行の数を返します。したがって、コードをよりコンパクトにすることができます

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