Обновления SQL-запросов затем возвращают изменения - PullRequest
0 голосов
/ 17 октября 2011

Я в настоящее время озадачен одной проблемой.Я могу вставлять и удалять записи из своей таблицы, но не могу обновить некоторые поля.Он временно обновляет его, прежде чем отменить изменения через 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, английский и африкаанс.Может ли автоматический номер вызывать проблему при обновлении?

1 Ответ

1 голос
/ 17 октября 2011

Я бы попробовал следующее. Я не уверен, поможет ли это, но вы можете проверить результат ExecSQL. Кажется, Бхарат упомянул, что в вашем коде есть незафиксированная транзакция.

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