-1

私は現在、1つの問題に困惑しています。テーブルからレコードを挿入および削除できますが、特定のフィールドを更新できません。0.5 秒後に変更を元に戻す前に、一時的に更新します。物理的に変更を確認できます。ところで、これは Delphi 7 で行われます。

CloseDatabase;     // Closes my database first to prevent an error from accessing one that is already open
OpenDatabase;      // Dynamically opens the database
ActivateEdits;

if dbeEnglish.Enabled then
begin
  qryDictionary.SQL.Text := 'Update [word list] set [english] = "'+dbeEnglish.Text+'" where  ([afrikaans] = "'+dbeAfrikaans.Text+'") and ([english] = "'+sEnglishBefore+'")';
  qryDictionary.ExecSQL;
end
else
begin
  qryDictionary.SQL.Text := 'Update [word list] set [afrikaans] = "'+dbeAfrikaans.Text+'" where ([english] = "'+dbeEnglish.Text+'") and ([afrikaans] = "'+sAfrikaansBefore+'")';
  qryDictionary.ExecSQL;
end;

SelectAll;          // SQL to select * from [word list]  as well as set the column widths
bEngOnce := False;  // variable i used to prevent both dbe (data base edits) from being edited
bAfrOnce := False;

OI で何かを間違って更新したり、欠落したりしていませんか? 更新するだけで永続的にはなりません。

言い忘れました: 表の単語リストには 3 つのフィールドがあります: ID と呼ばれる自動番号フィールド、英語、アフリカーンス語です。自動番号が更新に問題を引き起こしている可能性はありますか?

4

1 に答える 1

1

私は次のことを試してみます。役立つかどうかはわかりませんが、ExecSQL の結果を確認できます。コードに未コミットのトランザクションがあると Bharat が述べたようです。

...
if dbeEnglish.Enabled then
begin
  qryDictionary.Connection.BeginTrans;
  try
    qryDictionary.SQL.Text := 'Update [word list] set [english] = "'+dbeEnglish.Text+'" where  ([afrikaans] = "'+dbeAfrikaans.Text+'") and ([english] = "'+sEnglishBefore+'")';
    qryDictionary.ExecSQL;
    qryDictionary.Connection.CommitTrans;
  except
    qryDictionary.Connection.RollbackTrans;
  end;
end
else
begin
  qryDictionary.Connection.BeginTrans;
  try
    qryDictionary.SQL.Text := 'Update [word list] set [afrikaans] = "'+dbeAfrikaans.Text+'" where ([english] = "'+dbeEnglish.Text+'") and ([afrikaans] = "'+sAfrikaansBefore+'")';
    qryDictionary.ExecSQL;
    qryDictionary.Connection.CommitTrans;
  except
    qryDictionary.Connection.RollbackTrans;
  end;
end;
...

一部の行がコミットの影響を受けるかどうかを確認することもできます。これは TADOQuery.ExecSQL 関数の結果として返されるので、この方法で確認できます。

var
  RowsAffected: Integer;
...
RowsAffected := qryDictionary.ExecSQL;
ShowMessage(IntToStr(RowsAffected) + ' row(s) will be affected by commiting this query ...');
...
于 2011-10-17T12:47:34.180 に答える