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

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

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

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

Сообщение Luxor » 01.01.2012 20:44:00

На форме расположен DBGrid+DBNavigator
Связь с базой данных - компонентами вкладки SQLdb
Когда добавляю запись в таблицу (при закрытии формы вызывая метод ApplyUpdates у компонента SQLQuery - всё сохраняется отлично, и никаких проблем нет. НО! Если я меняю существующие записи в базе, удаляю записи в базе, то изменения не сохраняются и выдается ошибка. Как поступать при изменении или удалении записей через dbnavigator?
Luxor
новенький
 
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

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

Сообщение WAYFARER » 01.01.2012 21:13:25

СУБД какая? Какая ошибка? Что в SQL, UpdateSQL, DeleteSQL?
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

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

Сообщение Luxor » 01.01.2012 21:18:35

СУБД FIREBIRD.
В SQL = select field1 from MyTable.
А вот что надо указывать в UpdateSQL и DeleteSQL, если, например я изменяю несколько строк в таблице и потом вызываю ApplyUpdates?
Luxor
новенький
 
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

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

Сообщение WAYFARER » 01.01.2012 21:30:55

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

Добавлено спустя 7 минут 38 секунд:
Код: Выделить всё
UPDATE MyTable set field1 = :field1 where :OLD_...

С приставкой OLD хранятся старые значения полей до изменения.
Последний раз редактировалось WAYFARER 01.01.2012 23:13:16, всего редактировалось 1 раз.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

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

Сообщение Luxor » 01.01.2012 21:56:09

именно при применении изменений.
Код: Выделить всё
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;             

Возникаем ошибка
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Luxor
новенький
 
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

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

Сообщение WAYFARER » 01.01.2012 23:01:13

ага, все таки нужны запросы 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. Оно нужно скорее что бы отследить состояние датасета.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

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

Сообщение Luxor » 01.01.2012 23:06:29

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

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

Сообщение Luxor » 03.01.2012 19:46:17

Опять возникла проблема.
Если в таблице будет не одно, а два или более полей, то как запросы правильно составить?
Код: Выделить всё
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 - поле счетчик (ключевое поле), автоматически наращивается (создан генератор и триггер)
Luxor
новенький
 
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

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

Сообщение dunin » 03.01.2012 21:25:17

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

Хм... Просто добавляете нужные поля... Ну как-то так:
Код: Выделить всё
insert into table (field1, field2, field3) values (:field1, :field2, :field3)

И т.д.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

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

Сообщение Luxor » 03.01.2012 21:57:40

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;
Luxor
новенький
 
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

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

Сообщение WAYFARER » 04.01.2012 10:31:59

Luxor, по идее можно просто передать NULL
Код: Выделить всё
values (null,:field1,:field2,:field3);

а можно поле ID вообще опустить
Код: Выделить всё
insert into ISPOLNIL  (field1,field2,field3) values (:field1,:field2,:field3)
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 247

Рейтинг@Mail.ru
cron