Добавление записей в БД Firebird с помощью DBNavigator

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Добавление записей в БД Firebird с помощью DBNavigator

Сообщение Luxor »

На форме расположен DBGrid+DBNavigator
Связь с базой данных - компонентами вкладки SQLdb
Когда добавляю запись в таблицу (при закрытии формы вызывая метод ApplyUpdates у компонента SQLQuery - всё сохраняется отлично, и никаких проблем нет. НО! Если я меняю существующие записи в базе, удаляю записи в базе, то изменения не сохраняются и выдается ошибка. Как поступать при изменении или удалении записей через dbnavigator?
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

СУБД какая? Какая ошибка? Что в SQL, UpdateSQL, DeleteSQL?
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

СУБД FIREBIRD.
В SQL = select field1 from MyTable.
А вот что надо указывать в UpdateSQL и DeleteSQL, если, например я изменяю несколько строк в таблице и потом вызываю ApplyUpdates?
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

По идее можно ничего не указывать, если Select SQL запрос не сложнее select * from table.
А что за ошибка возникает? И при каких обстоятельствах? При попытки внести изменения или при применении изменений?

Добавлено спустя 7 минут 38 секунд:

Код: Выделить всё

UPDATE MyTable set field1 = :field1 where :OLD_...

С приставкой OLD хранятся старые значения полей до изменения.
Последний раз редактировалось WAYFARER 01.01.2012 23:13:16, всего редактировалось 1 раз.
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

именно при применении изменений.

Код: Выделить всё

procedure TDataModule1.MenuItem2Click(Sender: TObject);
begin
  //варианты включения
  frm_fst := Tfrm_fst.Create(Self);
  frm_fst.DBGrid1.DataSource := Datasource1;
  frm_fst.DBNavigator1.DataSource := Datasource1;
  Datasource1.DataSet := SQLQueryE;
   SQLQueryE.Close;
  SQLQueryE.SQL.Text :=
    'Select DEISTVIE From DEISTVIE_SUS_ON';
  SQLQueryE.Open;
  SQLQueryE.Active := True;
  //связь с таблицей
  frm_fst.ParentWindow := frm_start.Handle;
  frm_fst.Show;
end;           

А после вызова

Код: Выделить всё

procedure Tfrm_fst.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
 DataModule1.SQLQueryE.ApplyUpdates;
end;             

Возникаем ошибка
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

ага, все таки нужны запросы UpdateSQL/DeleteSQL
Если ваш SQL:

Код: Выделить всё

 'Select DEISTVIE From DEISTVIE_SUS_ON';

попробуйте добавть:
UpdateSQL

Код: Выделить всё

UPDATE DEISTVIE_SUS_ON SET DEISTVIE = :DEISTVIE 
WHERE DEISTVIE = :OLD_DEISTVIE 

DeleteSQL

Код: Выделить всё

DELETE FROM DEISTVIE_SUS_ON  WHERE DEISTVIE = :OLD_DEISTVIE


InsertSQL

Код: Выделить всё

INSERT INTO DEISTVIE_SUS_ON  (DEISTVIE ) VALUES (:DEISTVIE)


Добавлено спустя 4 минуты 51 секунду:
Luxor писал(а): SQLQueryE.Open;
SQLQueryE.Active := True;

При Open св-во Active становится True. Оно нужно скорее что бы отследить состояние датасета.
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

Спасибо WAYFARER за помошь. Всё прекрасно работает!!!!!!
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

Опять возникла проблема.
Если в таблице будет не одно, а два или более полей, то как запросы правильно составить?

Код: Выделить всё

procedure TDataModule1.MenuItem2Click(Sender: TObject);
begin
  frm_fst := Tfrm_fst.Create(Self);
  frm_fst.DBGrid1.DataSource := Datasource1;
  frm_fst.DBNavigator1.DataSource := Datasource1;
  Datasource1.DataSet := SQLQueryE;
   SQLQueryE.Close;
  SQLQueryE.SQL.Text :=
    'Select ID, DEISTVIE, FIO, DATA From DEISTVIE_SUS_ON';
  SQLQueryE.Open;
  SQLQueryE.Active := True;
  frm_fst.ParentWindow := frm_start.Handle;
  frm_fst.Show;
end;           


UpdateSQL?
DeleteSQL?
InseretSQL?

Здесь ID - поле счетчик (ключевое поле), автоматически наращивается (создан генератор и триггер)
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Luxor писал(а):Опять возникла проблема.
Если в таблице будет не одно, а два или более полей, то как запросы правильно составить?
...

Хм... Просто добавляете нужные поля... Ну как-то так:

Код: Выделить всё

insert into table (field1, field2, field3) values (:field1, :field2, :field3)

И т.д.
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

Luxor писал(а):Здесь ID - поле счетчик (ключевое поле), автоматически наращивается (создан генератор и триггер)

Luxor
новенький

Сообщения: 47
Зарегистрирован: 10.06.2010 19:30:43



Удалось решить проблему, установив у поля ID свойсво
SQLQueryE.FieldByName('ID').Required := False;
После этого всё генерируется нормально.
Записи удаляются и правятся нормально. При этом в запрове в условиях Where установил

Код: Выделить всё

SQLQueryE.SQL.Text :=
      'Select * From MyTable';
    SQLQueryE.UpdateSQL.Add(
      'UPDATE MyTable SET field1 = :field1, field2=:field2, field3=:field3  WHERE ID = :ID');
    SQLQueryE.DeleteSQL.Add('DELETE FROM MyTable  WHERE ID = :ID');
    SQLQueryE.InsertSQL.Add(
      'insert into ISPOLNIL  (ID,field1,field2,field3) values (:ID,:field1,:field2,:field3);');
    SQLQueryE.Open;
    {!!! ВАЖНО ПРИ АВТОПОЛЕ!!!}
    SQLQueryE.FieldByName('ID').Required := False;
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

Luxor, по идее можно просто передать NULL

Код: Выделить всё

values (null,:field1,:field2,:field3);

а можно поле ID вообще опустить

Код: Выделить всё

insert into ISPOLNIL  (field1,field2,field3) values (:field1,:field2,:field3)
Ответить