Форум: "Начинающим";
Текущий архив: 2009.05.03;
Скачать: [xml.tar.bz2];
ВнизUpdate Failed Найти похожие ветки
← →
Drowsy (2009-03-17 06:50) [0](IBASE)
Есть таблица с данными :
CREATE TABLE LAYOUT (
TYPERAZ D_TYPERAZ /* D_TYPERAZ = CHAR(20) */,
CNT_PRO SMALLINT,
WID_PRO_1 SMALLINT,
WID_PRO_2 SMALLINT,
WID_PRO_3 SMALLINT,
....
....
.....
);
TYPERAZ CNT_PRO WID_PRO_1 WID_PRO_2 WID_PRO_3
2х12 2 12 18 18
2,2х14 2 12 24 24
2,2х16 2 12 24 24
2,5х14 2 12 24 24
2,5х20 3 15 30 30
2,8х14 3 15 30 30
и новая:
CREATE TABLE DRYBAR (
CODE INTEGER NOT NULL, // ключ с автоинкрементом.
CNT_PRO SMALLINT
WID_PRO_1 SMALLINT
);
Вопрос: Можно ли одним запросом заполнить её значениями соответствующих полей из LAYOUT?
Делал разные попытки с
//===== INSERT
uoDryBar.SQL[ukINSERT] =
insert into DRYBAR_S
(CNT_PRO, WID_PRO_1)
SELECT
CNT_PRO, WID_PRO_1
From LAYOUT ;
//======== UPDATE
uoDryBar.SQL[ukMODIFY] =
update DRYBAR_S
set
CODE = :CODE,
CNT_PRO = :CNT_PRO,
WID_PRO_1 = :WID_PRO_1
where
CODE = :OLD_CODE
.....
При выполнении:
uoDryBar.ExecSQL(ukInsert);
всё время возникает ошибка Update Failed.
← →
Sergey13 © (2009-03-17 08:20) [1]А тебе это надо непременно из своей программы сделать? Это постоянная операция?
← →
Drowsy (2009-03-17 08:32) [2]Если честно, то мне нужна вообще 1 запись и её можно выделись ограничением Where, но
я только начинаю работать с IBASE и понял, что без чёткого понимания, как
работает связка TIBQuery - TIBUpdateSQL не обойтись, а с подобной ошибкой уже пару раз встречался и "обходил кривым боком"....
← →
Sergey13 © (2009-03-17 08:51) [3]> [2] Drowsy (17.03.09 08:32)
Твоя ошибка, по моему, не связана собственно с запросами. Ты где то напутал в коде.
Что есть uoDryBar?
← →
Drowsy (2009-03-17 10:15) [4]uoDryBar: TIBUpdateSQL;
qrDryBar: TIBQuery;
qrDryBar.UpdateObject := uoDryBar;
uoDryBar + qrDryBar - аналог (по-функциональности) TIBDataset.
← →
ЮЮ © (2009-03-17 10:41) [5]
Вопрос: Можно ли одним запросом заполнить её значениями
соответствующих полей из LAYOUT?
uoDryBar + qrDryBar - аналог (по-функциональности) TIBDataset.
.....
При выполнении:
uoDryBar.ExecSQL(ukInsert);
всё время возникает ошибка Update Failed.
Зачем для выполнения запроса, тем более вставляющего несколько записей, использовать связку TIBQuery + TIBUpdateSQL.
Почему просто не выполнить запрос в TIBSQL?
А запросы в TIBUpdateSQL должны затрагивать толко 1 запись, ИМХО, не больше и не меньше
← →
Drowsy (2009-03-17 10:58) [6]
> Зачем для выполнения запроса, тем более вставляющего несколько
> записей, использовать связку TIBQuery + TIBUpdateSQL.
>
> Почему просто не выполнить запрос в TIBSQL?
Можно. И работает. Только нужно иметь "агрегирующий" компонент работы с набором (select,insert,delete,modify)
, которым и является, как понял, TIBQuery + TIBUpdateSQL.
> А запросы в TIBUpdateSQL должны затрагивать толко 1 запись,
> ИМХО, не больше и не меньше
примечательно, что хотя ошибка Update Failed вываливается, но ВСЕ записи при uoDryBar.ExecSQL(ukInsert) заносятся в таблицу.
← →
Drowsy (2009-03-17 21:09) [7]Неужели никто не сталкивался с подобной ошибкой??
← →
ЮЮ © (2009-03-18 04:00) [8]
> Неужели никто не сталкивался с подобной ошибкой??
> примечательно, что хотя ошибка Update Failed вываливается,
> но ВСЕ записи при uoDryBar.ExecSQL(ukInsert) заносятся
> в таблицу.
Я же сказал. Записи-то заносятся, но так как одним запросом занесено более одной записи, то с точки зрения кэшированного датасета это ошибка. Аналогичная ошибка будет и в случае, если запрос не добавит ни одной записи. Запросы датасета должны модифицировать РОВНО ОДНУ запись
← →
Drowsy (2009-03-18 05:58) [9]Без цикла с параметром не обойтись??
← →
Drowsy (2009-03-18 06:06) [10]И ещё вопрос: делаю инсерт и коммит в таблицу,
а потом пытаюсь посмотреть селект набор по всем полям этой таблицы на гриде.
И он пуст. Внесённые изменения появляются только после нового звпуска программы.
← →
Sergey13 © (2009-03-18 08:45) [11]> [10] Drowsy (18.03.09 06:06)
Коммит в одной транзакции делаешь, селект в другой.
← →
ЮЮ © (2009-03-18 09:41) [12]
> Без цикла с параметром не обойтись??
Для выполнения твоего запроса - это я тоже говорил - не нужен TIBQuery , а нужен TIBSQL
← →
Sergey13 © (2009-03-18 10:44) [13]> [11] Sergey13 © (18.03.09 08:45)
Че то я поторопился похоже.
> [10] Drowsy (18.03.09 06:06)
> а потом пытаюсь посмотреть селект набор по всем полям этой
> таблицы на гриде.
Ты его переоткрываешь или просто смотришь в ранее открытый?
← →
Drowsy (2009-03-18 11:19) [14]Закрываю TIBQuery1. Делаю инсерт в таблицу на другом TIBQuery2 с другой транзакцией. Коммит этой транзакции. И отрываю селект-набор заданный в TIBQuery1. Смотрю его на гриде - пусто. Появлются данные после перезапуска проги.
← →
Sergey13 © (2009-03-18 11:29) [15]> [14] Drowsy (18.03.09 11:19)
> TIBQuery1
Почему не IBDataSet используешь?
Что за запросы конкретно?
← →
Drowsy (2009-03-18 11:39) [16]TIBDataSet, как я читал, более "глухой", по сравнению со связкой TIBQuery + TIBUpdateSQL ( т.е. труднее понять что происходит с даннымии и причину ошибок).
А запрос первый на инсерт данных в таблицу (он выполняется после коммита). После этого формирую набор Select * From Table, открываю его и бросаю на грид - пусто. Перезапускаю прогу, открываю грид - данные есть.
← →
Sergey13 © (2009-03-18 11:44) [17]> [16] Drowsy (18.03.09 11:39)
> т.е. труднее понять что происходит с даннымии и причину ошибок
То-то ты сейчас все понимаешь, что с данными происходит. 8-)
Что-то мне говорит за то, что ты комитишь другую транзакцию. Давай конкретный код.
← →
Drowsy (2009-03-18 11:46) [18]Недавно вообще 0-понимал. :)
← →
Drowsy (2009-03-18 11:59) [19]procedure FirstLoadSections;
begin
dmMain.qrExecProc.Transaction.StartTransaction;
with dmMain.qrExecProc, SQL do begin
Add(" insert into DRYBAR_S");
Add(" (PR_ID, LAY_CODE, TYPERAZ, CNT_PRO, WID_PRO_1, WID_PRO_2, WID_PRO_3,");
Add(" DRY_STEP, CNT_REM_PRO, CNT_FREE_PRO, VOL_PRICE, SLOPE_1, SLOPE_2, SLOPE_3,");
Add(" STEP_COL)");
Add("SELECT");
Add(INTToStr(PRID) +", CODE, TYPERAZ, CNT_PRO, WID_PRO_1, WID_PRO_2,");
Add(" WID_PRO_3, DRY_STEP, CNT_REM_PRO, CNT_FREE_PRO, VOL_PRICE, SLOPE_1,");
Add(" SLOPE_2, SLOPE_3, STEP_COL");
Add(" FROM LAYOUT4 ");
end;
dmMain.qrExecProc.ExecSQL;
dmMain.qrExecProc.Transaction.Commit;
with dmMain.QueryWork do begin
with SQL do begin
Clear;
Add("SELECT * FROM DRYBAR_S ");
end;
dmMain.QueryWork.Open;
end;
dmMain.dsQueryWork.DataSet := dmMain.QueryWork;
fmFDBTest.DBGridEh.DataSource := dmMain.dsQueryWork;
fmFDBTest.ShowModal;
dmMain.QueryWork.Close;
end;
← →
Drowsy (2009-03-18 12:37) [20]"Хоть бы кричал - аж зло берёт..." :)
← →
Sergey13 © (2009-03-18 13:26) [21]> [19] Drowsy (18.03.09 11:59)
Попробуй прописать все запросы и прочее свойства в дизайне.
← →
Drowsy (2009-03-18 13:28) [22]У меня они изначально в дизайне были. Я их от отчаяния вытащил в реал-тайм. :(
← →
Drowsy (2009-03-18 13:34) [23]Я, не выходя из проги, после инсерта смотрю в IBExpert-е и вижу, что все данные внесены. Но сколько форму с гридом не вызываю - пусто. Выхожу из проги, захожу снова, и только тогда появлются.
← →
Sergey13 © (2009-03-18 13:52) [24]> [23] Drowsy (18.03.09 13:34)
Какие параметры у твоих транзакций?
← →
Drowsy (2009-03-18 13:57) [25]Всё, разобрался!
Как понял, перед инсертом надо закрывать транзакцию на наборе.
После инсерта StartTransaction. И потом Ореn.
Сергей, Юрий, спасибо за участие!!!
← →
Drowsy (2009-03-18 13:59) [26]Я думал, по-наивности, что Close закрывает транзакцию на селект наборе.
← →
Sergey13 © (2009-03-18 14:11) [27]> [25] Drowsy (18.03.09 13:57)
> Всё, разобрался!
Сомнительно. 8-)
> Как понял, перед инсертом надо закрывать транзакцию на наборе.
А попонятнее можешь объяснить эту фразу. Какая транзакция, какой набор?
И все таки ответь на
> [24] Sergey13 © (18.03.09 13:52)
← →
Drowsy (2009-03-18 14:22) [28]Параметры всех транзакций по-умолчанию.
Было :
/=========================
dmMain.qrDryBar_S.Close;
(!!!) dmMain.trDryBar_S.Active := False;
with dmMain.IBSQL, SQL do begin
Transaction.StartTransaction;
Clear;
Add(" insert into DRYBAR_S");
//..........
//..........
ExecQuery;
Transaction.Commit;
end;
(!!!) dmMain.trDryBar_S.Active := True;
dmMain.qrDryBar_S.Open;
if dmMain.qrDryBar_S.RecordCount <> 0 then begin
fmFDBTest.DBGridEh.DataSource := dmMain.dsDryBar_S;
fmFDBTest.ShowModal;
end;
dmMain.qrDryBar_S.Close;
(!!!) dmMain.trDryBar_S.Active := False;
/=========================
(!!!) - добавленные-заработало.
Что скажешь,Сергей?
← →
Sergey13 © (2009-03-18 15:11) [29]> [28] Drowsy (18.03.09 14:22)
> Что скажешь,Сергей?
Шаманизм какой то. С бубном. 8-)
> Было :
> /=========
Что то не очень похоже на код из
> [19] Drowsy (18.03.09 11:59)
> if dmMain.qrDryBar_S.RecordCount
Не надо пользоваться RecordCount на серверных СУБД. На пустоту датасет проверяется isEmpty.
> (!!!) dmMain.trDryBar_S.Active := True;
> dmMain.qrDryBar_S.Open;
Это по сути одно и то же.
← →
Sergey13 © (2009-03-18 15:18) [30]> [28] Drowsy (18.03.09 14:22)
> Параметры всех транзакций по-умолчанию.
какие конкретно?
← →
Drowsy (2009-03-18 15:45) [31]Я параметры транзакций не устанавливал.
В дизайн тайме они так выглядят:
object trDryBar_S: TIBTransaction
Active = False
DefaultDatabase = dbProjects
AutoStopAction = saNone
Left = 416
Top = 400
end
← →
Drowsy (2009-03-18 15:47) [32]
> Что то не очень похоже на код из
Я ж не ровно на попе сижу, а еложу... :)
← →
Drowsy (2009-03-18 15:52) [33]dmMain.trDryBar_S.Active := True;
И
dmMain.qrDryBar_S.Open;
но:
dmMain.trDryBar_S.Active := False;
И
dmMain.qrDryBar_S.Close;
получается, что разные.
В этом, как я понял, и была ошибка в коде.
← →
Sergey13 © (2009-03-18 15:54) [34]> [31] Drowsy (18.03.09 15:45)
Правой кнопкой на них жмякни и выбери редактор транзакций - посмотри что написано.
← →
Drowsy (2009-03-18 16:01) [35]А там все радио-баттоны девственно-пусты.
Наверно, в ран-тайме по-умолчанию Read Commited устанавливается???
...
ХМ, хотя Transaction.Params, в рантайме, как я проверил, тоже пусты....
← →
Sergey13 © (2009-03-18 16:10) [36]> [35] Drowsy (18.03.09 16:01)
> Наверно, в ран-тайме по-умолчанию Read Commited устанавливается?
> ??
Ну так поставь ручками. И проверь без своих "наворотов".
← →
Drowsy (2009-03-18 16:26) [37]Да, если поставить Read Commited, то транзакция отрабатывает по Open, Close набора.
Спасибо, Сергей, бузнать! :)
← →
Sergey13 © (2009-03-18 16:49) [38]> [37] Drowsy (18.03.09 16:26)
Методом тыка долго будешь узнавать. И не факт, что узнаешь правильно.
Советую прочитать "Мир Интербейс" Ковязина.
Ну и ibase.ru сделать стартовой страницей. 8-)
← →
Drowsy (2009-03-18 17:10) [39]Обязательно!
Теория это основа.
Но, я уверен, что такие нюансы, которые я с твоей помощью, узнал,
в книгах если и встречаются, то без актуально-решаемой-в-данный-момент-проблемы, не запишутся в моск.
Теория+практика+добрый совет(ещё раз огромное спасибо) - это оптимально.
← →
Drowsy (2009-03-18 17:13) [40]Я Хелен Борри "Firebird..." штудирую. :)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.05.03;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.006 c