Добавление записей в БД Firebird с помощью DBNavigator
Модератор: Модераторы
Добавление записей в БД Firebird с помощью DBNavigator
На форме расположен DBGrid+DBNavigator
Связь с базой данных - компонентами вкладки SQLdb
Когда добавляю запись в таблицу (при закрытии формы вызывая метод ApplyUpdates у компонента SQLQuery - всё сохраняется отлично, и никаких проблем нет. НО! Если я меняю существующие записи в базе, удаляю записи в базе, то изменения не сохраняются и выдается ошибка. Как поступать при изменении или удалении записей через dbnavigator?
Связь с базой данных - компонентами вкладки SQLdb
Когда добавляю запись в таблицу (при закрытии формы вызывая метод ApplyUpdates у компонента SQLQuery - всё сохраняется отлично, и никаких проблем нет. НО! Если я меняю существующие записи в базе, удаляю записи в базе, то изменения не сохраняются и выдается ошибка. Как поступать при изменении или удалении записей через dbnavigator?
СУБД какая? Какая ошибка? Что в SQL, UpdateSQL, DeleteSQL?
СУБД FIREBIRD.
В SQL = select field1 from MyTable.
А вот что надо указывать в UpdateSQL и DeleteSQL, если, например я изменяю несколько строк в таблице и потом вызываю ApplyUpdates?
В SQL = select field1 from MyTable.
А вот что надо указывать в UpdateSQL и DeleteSQL, если, например я изменяю несколько строк в таблице и потом вызываю ApplyUpdates?
По идее можно ничего не указывать, если Select SQL запрос не сложнее select * from table.
А что за ошибка возникает? И при каких обстоятельствах? При попытки внести изменения или при применении изменений?
Добавлено спустя 7 минут 38 секунд:
С приставкой OLD хранятся старые значения полей до изменения.
А что за ошибка возникает? И при каких обстоятельствах? При попытки внести изменения или при применении изменений?
Добавлено спустя 7 минут 38 секунд:
Код: Выделить всё
UPDATE MyTable set field1 = :field1 where :OLD_...С приставкой OLD хранятся старые значения полей до изменения.
Последний раз редактировалось WAYFARER 01.01.2012 23:13:16, всего редактировалось 1 раз.
именно при применении изменений.
А после вызова
Возникаем ошибка
Код: Выделить всё
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;
Возникаем ошибка
У вас нет необходимых прав для просмотра вложений в этом сообщении.
ага, все таки нужны запросы UpdateSQL/DeleteSQL
Если ваш SQL:
попробуйте добавть:
UpdateSQL
DeleteSQL
InsertSQL
Добавлено спустя 4 минуты 51 секунду:
При Open св-во Active становится True. Оно нужно скорее что бы отследить состояние датасета.
Если ваш 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_DEISTVIEInsertSQL
Код: Выделить всё
INSERT INTO DEISTVIE_SUS_ON (DEISTVIE ) VALUES (:DEISTVIE)Добавлено спустя 4 минуты 51 секунду:
Luxor писал(а): SQLQueryE.Open;
SQLQueryE.Active := True;
При Open св-во Active становится True. Оно нужно скорее что бы отследить состояние датасета.
Спасибо WAYFARER за помошь. Всё прекрасно работает!!!!!!
Опять возникла проблема.
Если в таблице будет не одно, а два или более полей, то как запросы правильно составить?
UpdateSQL?
DeleteSQL?
InseretSQL?
Здесь ID - поле счетчик (ключевое поле), автоматически наращивается (создан генератор и триггер)
Если в таблице будет не одно, а два или более полей, то как запросы правильно составить?
Код: Выделить всё
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
- Откуда: Тољя††и
- Контактная информация:
Luxor писал(а):Опять возникла проблема.
Если в таблице будет не одно, а два или более полей, то как запросы правильно составить?
...
Хм... Просто добавляете нужные поля... Ну как-то так:
Код: Выделить всё
insert into table (field1, field2, field3) values (:field1, :field2, :field3)И т.д.
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, по идее можно просто передать NULL
а можно поле ID вообще опустить
Код: Выделить всё
values (null,:field1,:field2,:field3);а можно поле ID вообще опустить
Код: Выделить всё
insert into ISPOLNIL (field1,field2,field3) values (:field1,:field2,:field3)