Страница 1 из 1

XSQLDA index out of range

Добавлено: 28 май 2005, 05:07
ali
IB 6
это сообщение об ошибке выходит когда я пытаюсь сделать INSERT
в эту таблицу

CREATE GENERATOR GEN_SN_FILE;

CREATE TABLE SN_FILE (
CODE INTEGER NOT NULL,
FILE_TYPE CHAR(1) NOT NULL,
LINE VARCHAR(4000),
DIRECTION SMALLINT NOT NULL,
CODE_ORG SMALLINT NOT NULL
);

ALTER TABLE SN_FILE ADD CONSTRAINT CHK_SN_FILE check (FILE_TYPE IN ('A','D'));

ALTER TABLE SN_FILE ADD CONSTRAINT PK_SN_FILE PRIMARY KEY (CODE);

CREATE INDEX NDX_SN_FILE_TYPE ON SN_FILE (FILE_TYPE);

SET TERM ^ ;

/* Trigger: TR_BI_SN_FILE */
CREATE TRIGGER TR_BI_SN_FILE FOR SN_FILE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.CODE = GEN_ID(GEN_SN_FILE,1);
END
^
SET TERM ; ^

из этой процедуры

function TDataProcessor.List2Table(var ErrMsg: string): Boolean;
var
i: Integer; //FQuery: TIBQuery
begin
Result:=True;
try
FQuery.SQL.Text:= 'DELETE FROM SN_FILE WHERE FILE_TYPE=''D'' AND DIRECTION='+FDirection+' AND CODE_ORG='+FGetterCode+';';
FQuery.ExecSQL;
for I := 0 to FListFile.Count - 1 do
begin
FQuery.SQL.Text:='INSERT INTO SN_FILE (FILE_TYPE, LINE, DIRECTION, CODE_ORG) VALUES'
+'(''D'','+QuotedStr(FListFile.Strings)+','+FDirection+','+FGetterCode+');';
FQuery.ExecSQL;
Inc(FRowsProcessed);
if FRowsProcessed > MaxRowsProcessed then
begin
Application.ProcessMessages;
FRowsProcessed:= 1;
end;
end;
except on E: Exception do
begin
ErrMsg:=E.Message + FListFile.Strings+#13+'Line = '+IntToStr(i);
Result:=False;
FQuery.Transaction.RollbackRetaining;
end;
end;
end;

Строка с инсертом на которой возникает исключительная ситуация
без этой процедуры проходит без ошибок.
и перед ошибкой процедура записывает в таблицу более 7 тыс записей

Помогите разобратся в чем проблема ?

Re: XSQLDA index out of range

Добавлено: 28 май 2005, 08:51
Лысый
Ну почему нельзя нормально оформить сообщение, отформатировать код?!

Добавлено: 28 май 2005, 13:16
kdv
FQuery.SQL.Text:='INSERT INTO SN_FILE (FILE_TYPE, LINE, DIRECTION, CODE_ORG) VALUES'
+'(''D'','+QuotedStr(FListFile.Strings)+','+FDirection+','+FGetterCode+');';


что это за "D" ? в третьем диалекта так объекты именуются.
ты посмотри, что за результирующий sql у тебя получился, и попробуй его выполнить например в ibexpert.

FQuery.Transaction.RollbackRetaining;


вот это тоже - к чему оно? retaining, я имею в виду. просто так?

Добавлено: 28 май 2005, 14:07
ali
в IBExpert запрос на котором происходит ошибка , выболняется без ошибки , а RollbackRetaining нужен для того чтобы откатить изменения и возобновить транзакцию

Добавлено: 28 май 2005, 14:13
ali
да KDV ещё насчёт ''D'' обьясни в чём тут может быть проблема ?
чё то я не понял какие обьекты именуются в 3 диалекте как ''D'' ?
У меня 3-й.

Добавлено: 28 май 2005, 14:35
kdv
вот чудище, зачем тебе ВОЗОБНОВЛЯТЬ транзакцию в которой ты всего лишь вставляешь данные? Делай rollback, а потом стартуй IBTransaction когда тебе надо. Ты где вычитал, что rollbackRetaining тебе жизненно необходим?

насчет третьего диалекта и двойных кавычек.
Select * from "Table" - "Table" - это имя объекта, таблицы.
Почитал бы ты лучше документацию на эту тему.
приведи текст запроса, который "выполняется" в IBExpert.

дальше - по ошибке тебе надо смотреть свой собственный код и значения переменных при выполнении ошибочного оператора. Ты же exception перехватываешь? ну и дебаггером его, дебаггером. Скорее всего у тебя там какая-нибудь муть со значениями переменных.

Добавлено: 28 май 2005, 23:36
ali
'INSERT INTO SN_FILE (FILE_TYPE, LINE, DIRECTION, CODE_ORG) VALUES('D',
'U201023400003423,"N",NULL,NULL,NULL,NULL,NULL,"ÌÅÄÑÅÑÒÐÀ ","R","QK",NULL,NULL,NULL,NULL,"ÄÓÑÌÅÒÎÂÀ ",NULL,NULL,NULL,"ÍÀÔÈÑÀ","ÒÀØÊÅÍÒ","ÀÄÕÀÌÎÂÀ",NULL,NULL,
NULL,NULL,"ÊÀÐÀÑÓ 1 49/15","âðåìåííî íå ðàáîòàåò",NULL,NULL,
"ÒÀØ ÊÎË: ÊÐÀÑÍÎÃÎ ÏÎËÓÌÅÑßÖÀ ",NULL,NULL,"201023400003423","S",NULL,NULL,NULL,NULL,NULL,
NULL,#10.09.1981#,NULL,#20.05.2005#,#20.05.2005#,
NULL,NULL,1,23,2,NULL,1,139,1,1,122,10,NULL,906,23,
-1,-1,-1,NULL,NULL,-1,-1,-1,-1,122,NULL,-1,25,-1,-1,1,-1,
-1,82,NULL,61,-1,-1,NULL,1,42,-1',6,1);'#$D#$A

Добавлено: 29 май 2005, 15:43
kdv
в третьем диалекте в двойных кавычках указываются ИМЕНА ОБЪЕКТОВ. Строковые константы передаются только в одинарных кавычках.
потом, что это за символ # ?

и у тебя какая кодировка-то? если 1251, то сюда текст запостился бы нормально, а не "кракозябрами"

Добавлено: 29 май 2005, 18:28
ali
Так у меня Строковые константы и передаются в одинарных кавычках
FILE_TYPE 'D' LINE 'U201023400003423,"N",NULL,NU...,42,-1'

и до появления ошибки процедура успевает вставить больше 7 тыс
записей этого формата.

Добавлено: 29 май 2005, 18:56
kdv
Ok, вижу что одинарных нет. в любом случае - не можешь получить в отладчике по ошибке проблемные значения переменных?

Добавлено: 30 май 2005, 06:02
ali
DIRECTION 6
CODE_ORG 1

Это похоже глюк IB, люди говорят что у них такое было и так и не получилось исправить.

Добавлено: 30 май 2005, 10:33
kdv
какие люди и что говорят? такая ошибка была только при работе IBStoredProc. Параметров у тебя в запросе нет, так что ...