Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
9-1087354116
dimodim
2004-06-16 06:48
2004.10.17
У меня проблема с аним. Актор в GlScene


14-1096350505
Nikolay M.
2004-09-28 09:48
2004.10.17
Помогите с переводом на таджикский, плз


1-1096975263
antonn
2004-10-05 15:21
2004.10.17
Drag&Drop


3-1095308615
Sirus
2004-09-16 08:23
2004.10.17
Что лучше VARCHAR(1) или INTEGER???


9-1087201024
com
2004-06-14 12:17
2004.10.17
Как в DirectX вывести жирную линию?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский