Форум: "Базы";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизОшибка при IBTransaction.Commit - "List index out of bounds (8)" Найти похожие ветки
← →
Slonco (2004-09-16 10:55) [0]Помогите, пожалуйста.
Вставляю запись в таблицу и пытаюсь сделать Commit.
Вроде элементарщина, а не получается ничего. Причем есть исходники аналогичного приложения, где то же самое, та же самая таблица формируется без проблем! Не пойму что не так.
Может вы уже сталкивались с этой проблемой?
Подробнее:
---------------------------
Debugger Exception Notification
---------------------------
Project ANALYSIS.exe raised exception class EStringListError with message "List index out of bounds (8)". Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Проверку на InTransaction делаю. StartTransaction сделал.
Спасибо.
← →
Рамиль © (2004-09-16 11:04) [1]Ошибка в семнадцатой строке.
← →
Slonco (2004-09-16 11:06) [2]Почему в 17-ой? SQL запрос у меня в одну строку!
Или мастера так шутить изволят?
← →
Slonco (2004-09-16 11:15) [3]Я использую пару десятков параметров. Проверял 8-ой параметр - все в норме :(
← →
Рамиль © (2004-09-16 11:15) [4]Ты хочешь сказать, что у тебя код такого типа
IBTransaction.StartTransaction;
IBSQL.SQL.Text := "insert into ...";
IBSQL.ExecQuery;
IBTransaction.Commit;
и он выдает ошибку?..
← →
Slonco (2004-09-16 11:20) [5]Да, именно так. На Commit выдает указанную в самом начале ошибку.
← →
Sergey13 © (2004-09-16 11:21) [6]Что то сомниетльно мне что комит такие ошибки дает.
← →
Sergey13 © (2004-09-16 11:23) [7]А цикла там никакого нет?
← →
Slonco (2004-09-16 11:30) [8]Нет, циклов нет.
Я ж говорю - почти один в один скопировал уже написанный мной ранее блок.
Может у IBDatabase или IBTransaction имеют критичные по настройке свойства? Я все оставил по дефолту (кроме параметров подключения: пароль, имя пользователя, чапсет)
← →
Рамиль © (2004-09-16 11:31) [9]Slonco (16.09.04 11:20) [5]
Давай код. от StartTransaction до Commit
Почему вытягивать надо клещами?
← →
Slonco (2004-09-16 11:38) [10]:) клещами не надо! Я сам все скажу!!! :D
with IBQuery do begin
ContinueTrans;
SQL.Clear;
SQL.Add("INSERT INTO ANALYTIC (ID, ROUTDATE, ROUTE, SHEDULE, SHIFT, MIF, GN, "
+ "ATP, SSPCORR, SSP, FACT, REGUL, PLAN_OUT, FACT_OUT, PLAN_IN, FACT_IN, "
+ "STOP1, STOP2, STATUS, WORK_BEGIN, WBP_TIME, WBP_ROUTES, WBF_TIME, "
+ "WBF_ROUTES, WB_SS, IS1X_MIN, IS1X_MAX, IS1M_MIN, IS1M_MAX, IS1A20_MIN, "
+ "IS1A20_MAX, IS2X_MIN, IS2X_MAX, IS2M_MIN, IS2M_MAX, IS2A20_MIN, IS2A20_MAX, "
+ "WORK_BREAK, WFBX_BTM, WFBX_TOP, WFBM_BTM, WFBM_TOP, WFBA20_BTM, WFBA20_TOP, "
+ "WFSX_BTM, WFSX_TOP, WFSM_BTM, WFSM_TOP, WFSA20_BTM, WFSA20_TOP, ROUTES_FACT, "
+ "DISROUTMENT, WORK_END, WEP_TIME, WEP_ROUTES, WEF_TIME, WEF_ROUTES, WE_SS) "
+ "VALUES (:ID, :ROUTDATE, :ROUTE, :SHEDULE, :SHIFT, :MIF, :GN, "
+ ":ATP, :SSPCORR, :SSP, :FACT, :REGUL, :PLAN_OUT, :FACT_OUT, :PLAN_IN, :FACT_IN, "
+ ":STOP1, :STOP2, :STATUS, :WORK_BEGIN, :WBP_TIME, :WBP_ROUTES, :WBF_TIME, "
+ ":WBF_ROUTES, :WB_SS, :IS1X_MIN, :IS1X_MAX, :IS1M_MIN, :IS1M_MAX, :IS1A20_MIN, "
+ ":IS1A20_MAX, :IS2X_MIN, :IS2X_MAX, :IS2M_MIN, :IS2M_MAX, :IS2A20_MIN, :IS2A20_MAX, "
+ ":WORK_BREAK, :WFBX_BTM, :WFBX_TOP, :WFBM_BTM, :WFBM_TOP, :WFBA20_BTM, :WFBA20_TOP, "
+ ":WFSX_BTM, :WFSX_TOP, :WFSM_BTM, :WFSM_TOP, :WFSA20_BTM, :WFSA20_TOP, :ROUTES_FACT, "
+ ":DISROUTMENT, :WORK_END, :WEP_TIME, :WEP_ROUTES, :WEF_TIME, :WEF_ROUTES, :WE_SS)");
ParamByName("ID").AsInteger := 10000;
ParamByName("ROUTDATE").AsString := Copy(M[3],6,255);
ParamByName("ROUTE").AsInteger := StrToInt(Copy(M[2],4,255));
ParamByName("SHEDULE").AsInteger := StrToInt(Copy(M[6],4,255));
ParamByName("SHIFT").AsString := Copy(M[8],4,255);
ParamByName("MIF").AsInteger := StrToInt(Copy(M[0],4,255));
ParamByName("GN").AsString := Copy(M[1],4,255);
ParamByName("ATP").AsInteger := IBQallrep.FieldByName("ATP").AsInteger;
ParamByName("SSPCORR").AsInteger := cor;
ParamByName("SSP").AsInteger := pln;
ParamByName("FACT").AsInteger := fct;
ParamByName("REGUL").AsInteger := IBQallrep.Fields[19].AsInteger;
ParamByName("PLAN_OUT").AsString := Copy(FullTimeAsStr(StrToInt(Copy(M[9],4,255))),1,5);
ParamByName("FACT_OUT").AsString := Copy(FullTimeAsStr(StrToInt(Copy(M[11],4,255))),1,5);
ParamByName("PLAN_IN").AsString := Copy(FullTimeAsStr(StrToInt(Copy(M[10],4,255))),1,5);
ParamByName("FACT_IN").AsString := Copy(FullTimeAsStr(StrToInt(Copy(M[12],4,255))),1,5);
ParamByName("STOP1").AsInteger := StrToInt(Copy(M[16],4,3)); s:=StrToInt(Copy(M[15],5,255));
ParamByName("STOP2").AsInteger := StrToInt(Copy(M[16+s],Pos("=",M[16+s])+1,3));
ParamByName("STATUS").AsString :="";
ParamByName("WORK_BEGIN").AsString :="";
ParamByName("WBP_TIME").AsString :="";
ParamByName("WBP_ROUTES").AsInteger :=0;
ParamByName("WBF_TIME").AsString :="";
ParamByName("WBF_ROUTES").AsInteger :=0;
ParamByName("WB_SS").AsString :="";
ParamByName("IS1X_MIN").AsString :="";
ParamByName("IS1X_MAX").AsString :="";
ParamByName("IS1M_MIN").AsString :="";
ParamByName("IS1M_MAX").AsString :="";
ParamByName("IS1A20_MIN").AsString :="";
ParamByName("IS1A20_MAX").AsString :="";
ParamByName("IS2X_MIN").AsString :="";
ParamByName("IS2X_MAX").AsString :="";
ParamByName("IS2M_MIN").AsString :="";
ParamByName("IS2M_MAX").AsString :="";
ParamByName("IS2A20_MIN").AsString :="";
ParamByName("IS2A20_MAX").AsString :="";
ParamByName("WORK_BREAK").AsInteger :=0;
ParamByName("WFBX_BTM").AsString :="";
ParamByName("WFBX_TOP").AsString :="";
ParamByName("WFBM_BTM").AsString :="";
ParamByName("WFBM_TOP").AsString :="";
ParamByName("WFBA20_BTM").AsString :="";
ParamByName("WFBA20_TOP").AsString :="";
ParamByName("WFSX_BTM").AsString :="";
ParamByName("WFSX_TOP").AsString :="";
ParamByName("WFSM_BTM").AsString :="";
ParamByName("WFSM_TOP").AsString :="";
ParamByName("WFSA20_BTM").AsString :="";
ParamByName("WFSA20_TOP").AsString :="";
ParamByName("ROUTES_FACT").AsString :="";
ParamByName("DISROUTMENT").AsString :="";
ParamByName("WORK_END").AsString :="";
ParamByName("WEP_TIME").AsString :="";
ParamByName("WEP_ROUTES").AsInteger :=0;
ParamByName("WEF_TIME").AsString :="";
ParamByName("WEF_ROUTES").AsInteger :=0;
ParamByName("WE_SS").AsString :="";
ExecSQL;
CommitTrans;
end;
M.Free;
end;
end;
procedure TAMainForm.ContinueTrans;
begin
with IBTransaction do begin
if not InTransaction then
StartTransAction;
end;
end;
procedure TAMainForm.CommitTrans;
begin
with IBTransaction do begin
if not InTransaction then Exit;
try
Commit;
except
Rollback;
end;
end;
end;
← →
Марк (2004-09-16 11:59) [11]Судя по классу ошибки (EStringListError) исключение происходит не при выполнении запроса, а при создании текста SQL в компоненте IBQuery. Может есть смысл создать запрос статически, а не в кодах. Например, через построитель (IBExpret позволяет строить любые типы запросов простым перетаскиванием таблицы на поле SQL редактора). Там же можно сформировать аналогичную хранимую процедуру и проверить ее работу в режиме пошаговой отладки с конкретными параметрами.
← →
Sergey13 © (2004-09-16 12:05) [12]С массивом разберись ИМХО. Или что там у тебя такое M[16+s]
← →
Slonco (2004-09-16 12:11) [13]За него я и переживаю - за M (это TStringList).
Дело том, что когда я не ставлю коммит, то запись заносится в таблицу!!! Странности...
Боюсь, что придется отказаться от параметров ради проверки...
← →
Sergey13 © (2004-09-16 12:19) [14]2[13] Slonco (16.09.04 12:11)
>Боюсь, что придется отказаться от параметров ради проверки...
Можно и просто в отладчике посмотреть значения. Можно просто по очереди отключать параметры (и поле соответственное), пока ошибка не уйдет.
← →
Slonco (2004-09-16 12:24) [15]А как смотреть в дебаггере значения параметров? Через очки? Или есть хитрый способ о котором я не знаю?
← →
Sergey13 © (2004-09-16 12:27) [16]Например через присваивание такого же значения "левой" переменной.
← →
Danilka © (2004-09-16 12:28) [17]поставь точку останова вот-сюда:
ParamByName("STOP2").AsInteger := StrToInt(Copy(M[16+s],Pos("=",M[16+s])+1,3));
и посмотри чему у тебя равен s, а также количество строк в M, скорее всего, оно будет меньше чем 16+s.
← →
Johnmen © (2004-09-16 12:32) [18]Пара замечаний.
1. Зачем параметры в динамически изменяемом запросе ? Смысл ?
2. Стартовать тр-ию перед ExecSQL.
И, как сказали выше, ошибка в индексе стринглиста. Однозначно !
← →
Sergey13 © (2004-09-16 12:35) [19]2[18] Johnmen © (16.09.04 12:32)
>1. Зачем параметры в динамически изменяемом запросе ? Смысл ?
Что бы самому потом прочитать то что написал. Иначе башку сломаешь. 8-)
← →
Johnmen © (2004-09-16 12:40) [20]>Sergey13 © (16.09.04 12:35) [19]
Ну разве что...:)
Тогда не помешает после формирования текста сделать Prepare.
← →
Slonco (2004-09-16 15:07) [21]В списке строк М около 500 строк и s=12, так что 12+16 никак не превысят 500.
Значения все проверил - за пределы НИ ОДНО из них не вышло!
Что делать - ума не приложу :"(
← →
Slonco (2004-09-16 15:13) [22]И еще. Во время формирования ошибки не может быть - т.к. ExecSQL прогоняется без ошибки - ошибка только после Commit!
← →
Sergey13 © (2004-09-16 15:14) [23]2[21] Slonco (16.09.04 15:07)
По очереди давай значение параметру напрямую в коде корректным значением. типа
ParamByName("STOP2").AsInteger := 12;
Поймешь где ошибка. А она где то здесь. ИМХО
← →
Slonco (2004-09-16 15:16) [24]Ладно, попробую...
← →
Slonco (2004-09-16 15:21) [25]Попробовал все - без толку.
← →
Sergey13 © (2004-09-16 15:29) [26]Все строки пробовал?
← →
Slonco (2004-09-16 15:38) [27]Все до единой!!!
← →
Sergey13 © (2004-09-16 15:42) [28]>IBQallrep.Fields[19].AsInteger;
А с этим все нормально? Есть стока?
← →
Slonco (2004-09-16 15:50) [29]>>IBQallrep.Fields[19].AsInteger;
>А с этим все нормально? Есть стока?
Этот я подправил - ничего не дало...
Я понял в чем дело - у меня там рекурсия вышла :)
Прошу простить за потраченное впустую время :(
Всем СПАСИБО!
← →
Рамиль © (2004-09-16 16:17) [30]А ведь спрашивали насчет циклов!:)
← →
Slonco (2004-09-16 16:26) [31]Да то не цикл был!
Я просто вызов этой процедуры повесил на OnChange компонента DBMemo. Вышло так, что эта процедура 2 раза вызывалась... или как-то там еще, по хитрому... %)
← →
Рамиль © (2004-09-16 16:35) [32]Slonco (16.09.04 16:26) [31]
повесил на OnChange компонента DBMemo
:o)
← →
Slonco (2004-09-16 16:39) [33]%) ...надо меньше пить... :*)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.035 c