Лазарус, не могу заставить работать обновление БД. Как я могу предварительно просмотреть то, что отправляется?

Привет, у меня есть настройка формы с использованием модулей TMySQL51Connection, TSQLTransaction и TSQLQuery, она без проблем извлекает информацию из БД, но у меня проблемы с обновлениями.

БД довольно большая, поэтому я начинаю только с первой пары строк, как только они заработают, я расширим запрос.

Мой TSQLQuery.UpdateSQL выглядит следующим образом

UPDATE table SET
ContactFirst = :ContactFirst,
ContactSur = :ContactSur
WHERE AccountID = :AccountID

Затем у меня есть кнопка в моей форме, событие onCLick содержит:

begin
    accSelect.Edit;
    accSelect.Post;
    accSelect.ApplyUpdates;
    dbTransaction.CommitRetaining;
    sqlbl1.Caption := accSelect.UpdateSQL;
end;

Нажатие кнопок ничего не делает с БД, не генерирует сообщений об ошибках, просто обновляет заголовок на sqlbl1. Можно ли как-то предварительно просмотреть, что Lazarus отправляет в БД с включенными значениями, чтобы я мог отследить, что происходит не так?

Я попытался добавить событие регистрации в SQLConnection, но не смог понять, как заставить его генерировать журналы.


person Funk247    schedule 29.07.2013    source источник
comment
Знаете ли вы, как использовать код "Шаг в" и "Шаг через" в вашей IDE? Поддерживает ли ваша IDE часы? Я знаю, что в Delphi вы можете проходить свой код по одной строке за раз и просто наводить указатель мыши на переменную, чтобы увидеть ее текущее значение (то есть в режиме отладки). Я думаю, вам нужно опубликовать больше кода, если вы ожидаете, что мы обнаружим ошибки или неполный код для конкретной ожидаемой функциональности.   -  person Sam    schedule 29.07.2013
comment
Присваиваете ли вы значения параметрам (например, ParamByName ('ContactFirst'). Value: = SomeVariant)? Возможно, вам нужно вызвать метод Update или Exec для TSQLQuery между Edit и Post?   -  person Sam    schedule 29.07.2013


Ответы (1)


По моему опыту, методы Edit, Post и ApplyUpdates используются в сочетании с методом TClientDataSet. В этом случае вы просто присвоите новые значения полям в CDS (после перехода к записи, которую хотите отредактировать), а затем опубликуете эти изменения (нет необходимости в операторе Update SQL). Что-то вроде этого...

MyCDS.Edit;
MyCDS.FieldByName('ContactFirst').Value := sContactFirstName;
MyCDS.FieldByName('ContactSur').Value := sContactSurname;
MyCDS.Post;
MyCDS.ApplyUpdates;

В качестве альтернативы вы можете использовать компонент Query, записать UPDATE SQL в свойство SQL и использовать ExecSQL или любой другой метод, реализованный для этого компонента (есть много компонентов доступа к базе данных, каждый из которых имеет свои особенности)

Вот какой-то код с головы. Простите меня, но я не знаком со спецификой Lazarus - это в основном код Delphi.

MySQLQuery.SQL.Clear;
MySQLQuery.SQL := 'UPDATE MyTable 
                   SET    ContactFirst = :ContactFirst,
                          ContactSur = :ContactSur
                   WHERE AccountID = :AccountID';
MySQLQuery.Params.ParamByName('ContactFirst').Value := sContactFirstName;
MySQLQuery.Params.ParamByName('ContactSur').Value := sContactSurname;
MySQLQuery.Params.ParamByName('AccountID').Value := iAccountID;
try
  MySQLQuery.ExecSQL;
  ShowMessage('Update succeeded');
except on e: Exception do
  ShowMessage(e.Message);
end;

Так что может случиться так, что вы использовали половину обоих методов и ни один из них полностью.

person Sam    schedule 29.07.2013
comment
Мне этого было достаточно, я воспользовался вторым предложением, работает отлично :D - person Funk247; 30.07.2013
comment
Будущие версии FPC будут иметь TSqlStatement, который немного лучше оптимизирован для такого рода вещей. - person Marco van de Voort; 31.07.2013