'Translate Error. Value out of bounds.'

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

'Translate Error. Value out of bounds.'

Сообщение McSSN » 26 май 2005, 10:41

При переходе с Delphi 3 на 6 БД (Interbase 5.5)
при выполнении процедур (TStoredProc) начала выдавать
ошибку - 'Translate Error. Value out of bounds.'

С помощью SQL Explorer показывает тело только одной процедуры,
состоящей тольно из англйиских букв.
С помощью <Interbase interactive SQL> - <Extract database> -
показывает все (кодировка win1253).

КАК ЭТО ВЫЛЕЧИТЬ ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 май 2005, 10:48

ошибку - 'Translate Error. Value out of bounds.'
по-моему у сервера такой ошибки нет. ибо он ничего не переводит.
КАК ЭТО ВЫЛЕЧИТЬ ?
кодировка алиаса БДЕ тоже должна быть win1253. Скорее всего просто настройки алиаса BDE при установке D6 убились.

McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

Сообщение McSSN » 26 май 2005, 12:10

Вы правы, ошибку выдаёт BDE (TStoredProc). В связи с этим приношу извинения форуму. Но раз уж топик окрыт может знающие люди помогут.

Delphi 6 на компе уже давно и альяс тоже. Я просто пытаюсь адаптировать прогу под Delphi 6.

Я сейчас подправил значение соответсвующего поля RDB$CHARACTER_SET_ID в таблице RDB$FIELDS и тело прлцедур отображает в SQL Explorer. Но ошибку в проге продолжает выдавать.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 май 2005, 12:33

Но ошибку в проге продолжает выдавать.
в какой момент?
Я сейчас подправил значение соответсвующего поля RDB$CHARACTER_SET_ID в таблице RDB$FIELDS
ну молодец. колупнул базу, не думая. теперь я уже не верю, что все это работало под D3.

см. www.ibase.ru/devinfo/ibrusfaq.htm , на тему национальных символов в текстах процедур и триггеров. В любом случае, к tstoredproc это не имеет никакого отношения.

В общем, так. для ПРИЛОЖЕНИЯ все это значения никакого не имеет. Если алиас настроен правильно, то оно как работало с БД, так и должно.
Для базы то же самое - если ее не меняли, ей пофигу какие там приложения и алиасы снаружи.

В общем, выясни сначала, где ты там чего наковырял, а потом разбирайся, почему перестало работать.

McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

Сообщение McSSN » 26 май 2005, 13:45

Ошибку выдаёт здесь: StoredProc.ExecProc.

Насчёт "не думая" - слишком. Если ничего не пробовать - ничего не выйдет. Потом, backup я взял.
Пойду читать ссылку. Спасибо за внимание.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 май 2005, 14:42

Насчёт "не думая" - слишком.
ну так если ты их "подправил", то значит ты как то умудрился создать или модифицировать процедуру в соединении БЕЗ нужного чарсета, не так ли?

И кстати, редактировать БД надо не в SQL Explorer, а в IBExpert. Тогда не будет таких проблем.

McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

Сообщение McSSN » 26 май 2005, 15:44

Подправил я не "их", а только значение поля одной записи.
UPDATE RDB$FIELDS
SET RDB$CHARACTER_SET_ID = 54
WHERE RDB$FIELD_NAME='RDB$SOURCE'

После этого, как говорил, стало показывать нормально.
Насчёт SQL Explorer - его глюкавость меня и самого достала.
Пойду пользовать IBExpert.
БД не моя. Я просто помогаю в адаптации.

Ошибка выскакивает здесь:

{-----DBTables-------}

procedure TStoredProc.BindParams;
...
Check(DbiQSetProcParams(StmtHandle, High(FParamDescs)+1,
PSPParamDesc(FParamDescs), FRecordBuffer));

Пока так и не понял, в чём причина

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 май 2005, 16:13

UPDATE RDB$FIELDS
SET RDB$CHARACTER_SET_ID = 54
WHERE RDB$FIELD_NAME='RDB$SOURCE'
это муть какая то... ты б хоть выбрал запросом сначала, что меняешь.

select r.RDB$procedure_NAME, r.RDB$PARAMETER_NAME, f.RDB$FIELD_NAME,
f.RDB$CHARACTER_SET_ID, f.RDB$COLLATION_ID
from rdb$fields f, rdb$procedure_parameters r
where f.RDB$FIELD_NAME = r.RDB$FIELD_SOURCE and
r.RDB$procedure_NAME not starting with 'RDB$' and f.RDB$FIELD_TYPE in (14,37,40)

McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

Сообщение McSSN » 27 май 2005, 11:08

Я, конечно, не мастер INTERBASEa, но мне хватило 2 минуты, чтобы посмотреть системные таблицы и увидеть, что в БД всего 6 процедур, определены пользователем, что текст процедур хранится в таблице RDB$PROCEDURES поле RDB$PROCEDURE_SOURCE, что это поле определено как "RDB$SOURCE" в RDB$RELATION_FIELDS и имеет кодировку UNICODE_FSS – значение 3 (таблица RDB$FIELDS поле RDB$CHARACTER_SET_ID). Соответственно меняя 3 на 54, получаю WIN1253 для всех процедур (мемо поля, в котором хранится тело процедур) БД.

McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

Сообщение McSSN » 27 май 2005, 11:09

И потом, пробуя это, было интересно, что получится. А вообще, чувствую, тему пора закрывать, поскольку решение проблемы – в Delphi. Просьба к модератору перенести топик в форум Delphi :D .
Спасибо.

McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

Сообщение McSSN » 27 май 2005, 11:13

Ошибка была в неправильной передаче значений параметроа типа TDateTime в TStoredProc.
Было ParamByName('MyDate').AsDate := StrToDate('21/12/2005')
Надо ParamByName('MyDate').AsDateTime := StrToDate('21/12/2005')

До встречи

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 27 май 2005, 11:33

нету у нас обсуждений Delphi.
StrToDate('21/12/2005')
вообще то, с разделителем / - формат mm/dd/yyyy. так принято. и ориентация на жесткий строковый исходный формат может принести много веселых минут после установки приложения, на котором формат даты не такой.
Я, конечно, не мастер INTERBASEa, но мне хватило 2 минуты, чтобы посмотреть системные таблицы и увидеть, что в БД всего 6 процедур, определены пользователем, что текст процедур хранится в таблице RDB$PROCEDURES поле RDB$PROCEDURE_SOURCE, что это поле определено как "RDB$SOURCE" в RDB$RELATION_FIELDS и имеет кодировку UNICODE_FSS – значение 3 (таблица RDB$FIELDS поле RDB$CHARACTER_SET_ID). Соответственно меняя 3 на 54, получаю WIN1253 для всех процедур (мемо поля, в котором хранится тело процедур) БД.
хвалиться тут абсолютно нечем, потому что данная операция некорректна, и может привести к проблемам с backup/restore. К тому, что я сказал в этом топике, мне добавить нечего.

удалю топик чуть позже...

McSSN
Сообщения: 8
Зарегистрирован: 30 мар 2005, 12:38

Сообщение McSSN » 27 май 2005, 11:46

StrToDate('21/12/2005') - это я написал для примера.
На самом деле значение берётся из компонента, положенного на форму. Весь фокус именно "AsDateTime".
Когда я понял, что проблема в Delphi - вопро уже был задан.
Так что извиняйте. А вообще спасибо, что не отфутболили сразу.

Ответить