![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись не удаляется [InterBase, FireBird]
DevilDevil © (2006-04-15 22:31:00)При удалении записи средствами SQL, она действительно удаляется из Грида. Однако при следующем запуске проги, запись снова появляется. Почему?
// формирую SQL запрос в свойстве DeleteSQL
...
Query1.Delete;
// пробовал с Query1.ApplyUpdates;
DevilDevil (2006-04-17 23:02:00) [1]> Виталий Панасенко (17.04.06 13:07) [6]
Если все это аналогично таким же св-вам в FIBPl\us, то гонишь уже ты..
Код должен выглядеть примерно так:
Добавление
Query.Append;
Query.FieldByName('COMPANY').AsString := Company;
Query.FieldByName('MachineID').AsInteger := MachineID;
Query.FieldByName('History').Assign(History);
Query.Post;
Для удаления:
Query.Delete;
И не завбыть подтвердить транзакцию
Виталий, ты в одной ветке грубишь, во второй помогаешь. Но, всё равно, спасибо! Сделал как ты сказал, всё сработало без проблем. Однако для удаления вроде всё таки надо заполнять DeleteSQL. А как быть с Edit?Там же надо указывать, какую запись изменяешь. У меня будет ключ ID : integer
Виталий Панасенко (2006-04-17 11:31:00) [2]
> DevilDevil © (17.04.06 10:33) [10]
>
> > Виталий Панасенко (17.04.06 09:11) [8]
>
>
> В IB Object есть несколько SQL свойств: InsertSQL, EditSQL,
> DeleteSQL и SQL. Соответственно, первый запрос выпольняется
> при Insert, второй - вроде при Update или Edit, третий -
> при Delete, последний - при ExecSQL. По этому методу у
> меня вся таблица отображается снова
Если все это аналогично таким же св-вам в FIBPl\us, то гонишь уже ты..
Код должен выглядеть примерно так:
Добавление
Query.Append;
Query.FieldByName('COMPANY').AsString := Company;
Query.FieldByName('MachineID').AsInteger := MachineID;
Query.FieldByName('History').Assign(History);
Query.Post;
Для удаления:
Query.Delete;
И не завбыть подтвердить транзакцию
Johnmen (2006-04-17 10:34:00) [3]
> K_VAL (17.04.06 10:31) [9]
Что за чудо с try-finally?
DevilDevil (2006-04-17 10:33:00) [4]
> Виталий Панасенко (17.04.06 09:11) [8]
В IB Object есть несколько SQL свойств: InsertSQL, EditSQL, DeleteSQL и SQL. Соответственно, первый запрос выпольняется при Insert, второй - вроде при Update или Edit, третий - при Delete, последний - при ExecSQL. По этому методу у меня вся таблица отображается снова
K_VAL (2006-04-17 10:31:00) [5]var BM1:TMemoryStream;
begin
IBQuery2.Close;
IBQuery2.SQL.Clear;
IBQuery2.SQL.Add('Select * from KVARTIRA_S (:kod)');
IBQuery2.Params[0].AsInteger := IBStoredProc1.ParambyName('kod_kvar').AsInteger;
IBQuery2.Open;
try
finally
IBTransaction2.Active := true; // insert
end;
//
BM1 := TMemoryStream.Create;
Image2.Picture.Graphic.SaveToStream(BM1);
// компонент Image2 - читать в поток
IBQuery2.Edit;
try
IBQuery2PLAN_KV.LoadFromStream(BM1);
// поле IBQuery2[PLAN_KV] - заполняется из потока
finally
BM1.Free;
end;
IBUpdateSQL2.SetParams(ukModify);
IBUpdateSQL2.Apply(ukModify);
try
finally
IBTransaction2.Active := false;
IBQuery2.Close;
IBQuery2.UnPrepare;
end;
// insert - update
Виталий Панасенко (2006-04-17 09:11:00) [6]Это я с утра "гоню"
А если так :
with Query do begin
ParamByName('Company').AsString := Company;
ParamByName('MachineID').AsInteger := MachineID;
ParamByName('History').Assign(History);
ExecSQL;
end;
Виталий Панасенко (2006-04-17 09:09:00) [7]А если так :
with Query do begin
//Prepare;
Insert;
ParamByName('Company').AsString := Company;
//ParamByName('MachineID').AsInteger := MachineID;
ParamByName('History').Assign(History);
Post;
{Close;
ExecSQL;// обновляю данные в гриде}
end;
DevilDevil (2006-04-16 14:06:00) [8]Ну хорошо, обновляю так:
Query.Post;
Query.Close;
Query.ExecSQL;
Сейчас другая проблема. Необходимо вставить новую запись. Заполняю InsertSQL:
INSERT INTO Licenses (Company, MachineID, History)
VALUES (:Company, 1234567, :History)
Проблема с параметрами. Т.е. я создаю и настраиваю параметры Company, MachineID, ...
Однако эти параметры не заносятся в таблицу, заносятся только явно указанные. В этом примере - MachineID. Лелаю так:
with Query do begin
//Prepare;
ParamByName('Company').AsString := Company;
//ParamByName('MachineID').AsInteger := MachineID;
ParamByName('History').Assign(History);
Insert;
Post;
Close;
ExecSQL;// обновляю данные в гриде
end;
Не может же быть так, что параметры не действуют на InsertSQL
P.S. Я использую компоненты IB Objects
Johnmen (2006-04-16 02:22:00) [9]Такие профессионалы, как я, справляются с обновлением по-разному.
Это зависит от исходной постановки и конечной реализации задачи...
Какая постановка у тебя, лично мне не ясно...
DevilDevil (2006-04-16 01:56:00) [10]> Johnmen © (16.04.06 01:29) [3]
Да, ты очень помог
Я не спрашиваю "что", я спрашиваю "как". Как такие профессионалы как ты справляются с обновлением, неужели бональной выборкой?
Johnmen (2006-04-16 01:29:00) [11]По блобам - читать TBlobStream и т.п. и т.д.
> При Query.Insert не обновляются поля Грида.
Грид показывает то, что в наборе данных есть. НД обновился? Нет. Вот и ответ...
DevilDevil (2006-04-16 01:22:00) [12]> Johnmen © (15.04.06 23:22) [1]
Нет никакого флуда, есть задача, её надо решать
Вообще, я понял из-за чего не удалялось. Я задал в одном из свойств транзакцию. Использовал транзакцию как следует, всё получилось
Сейчас другой вопрос. В базе есть Блоб поля. Если обычные строковые и числовые поля я без особых проблем создам/изменю средствами SQL, то с этим трудности. Объясните, пожалуйста, как. Вообще, я раньше решал эту задачу с помощью компонента-таблицы. Начальству понадобились транзакции и из Query. А я в базах далеко не опытен. Поэтому, собственно, и прошу помощи. Да! При Query.Insert не обновляются поля Грида. Как решить?
Johnmen (2006-04-15 23:22:00) [13]>формирую SQL запрос в свойстве DeleteSQL
Как он выглядит?
>Однако при следующем запуске проги, запись снова появляется. Почему?
Потому, что транзакция была откачена. Видимо, неявно...
> пробовал с Query1.ApplyUpdates;
Это то здесь причём???