Страница 1 из 1
'Translate Error. Value out of bounds.'
Добавлено: 26 май 2005, 10:41
McSSN
При переходе с Delphi 3 на 6 БД (Interbase 5.5)
при выполнении процедур (TStoredProc) начала выдавать
ошибку - 'Translate Error. Value out of bounds.'
С помощью SQL Explorer показывает тело только одной процедуры,
состоящей тольно из англйиских букв.
С помощью <Interbase interactive SQL> - <Extract database> -
показывает все (кодировка win1253).
КАК ЭТО ВЫЛЕЧИТЬ ?
Добавлено: 26 май 2005, 10:48
kdv
ошибку - 'Translate Error. Value out of bounds.'
по-моему у сервера такой ошибки нет. ибо он ничего не переводит.
КАК ЭТО ВЫЛЕЧИТЬ ?
кодировка алиаса БДЕ тоже должна быть win1253. Скорее всего просто настройки алиаса BDE при установке D6 убились.
Добавлено: 26 май 2005, 12:10
McSSN
Вы правы, ошибку выдаёт BDE (TStoredProc). В связи с этим приношу извинения форуму. Но раз уж топик окрыт может знающие люди помогут.
Delphi 6 на компе уже давно и альяс тоже. Я просто пытаюсь адаптировать прогу под Delphi 6.
Я сейчас подправил значение соответсвующего поля RDB$CHARACTER_SET_ID в таблице RDB$FIELDS и тело прлцедур отображает в SQL Explorer. Но ошибку в проге продолжает выдавать.
Добавлено: 26 май 2005, 12:33
kdv
Но ошибку в проге продолжает выдавать.
в какой момент?
Я сейчас подправил значение соответсвующего поля RDB$CHARACTER_SET_ID в таблице RDB$FIELDS
ну молодец. колупнул базу, не думая. теперь я уже не верю, что все это работало под D3.
см.
www.ibase.ru/devinfo/ibrusfaq.htm , на тему национальных символов в текстах процедур и триггеров. В любом случае, к tstoredproc это не имеет никакого отношения.
В общем, так. для ПРИЛОЖЕНИЯ все это значения никакого не имеет. Если алиас настроен правильно, то оно как работало с БД, так и должно.
Для базы то же самое - если ее не меняли, ей пофигу какие там приложения и алиасы снаружи.
В общем, выясни сначала, где ты там чего наковырял, а потом разбирайся, почему перестало работать.
Добавлено: 26 май 2005, 13:45
McSSN
Ошибку выдаёт здесь: StoredProc.ExecProc.
Насчёт "не думая" - слишком. Если ничего не пробовать - ничего не выйдет. Потом, backup я взял.
Пойду читать ссылку. Спасибо за внимание.
Добавлено: 26 май 2005, 14:42
kdv
Насчёт "не думая" - слишком.
ну так если ты их "подправил", то значит ты как то умудрился создать или модифицировать процедуру в соединении БЕЗ нужного чарсета, не так ли?
И кстати, редактировать БД надо не в SQL Explorer, а в IBExpert. Тогда не будет таких проблем.
Добавлено: 26 май 2005, 15:44
McSSN
Подправил я не "их", а только значение поля одной записи.
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));
Пока так и не понял, в чём причина
Добавлено: 26 май 2005, 16:13
kdv
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)
Добавлено: 27 май 2005, 11:08
McSSN
Я, конечно, не мастер 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 для всех процедур (мемо поля, в котором хранится тело процедур) БД.
Добавлено: 27 май 2005, 11:09
McSSN
И потом, пробуя это, было интересно, что получится. А вообще, чувствую, тему пора закрывать, поскольку решение проблемы – в Delphi. Просьба к модератору перенести топик в форум Delphi

.
Спасибо.
Добавлено: 27 май 2005, 11:13
McSSN
Ошибка была в неправильной передаче значений параметроа типа TDateTime в TStoredProc.
Было ParamByName('MyDate').AsDate := StrToDate('21/12/2005')
Надо ParamByName('MyDate').AsDateTime := StrToDate('21/12/2005')
До встречи
Добавлено: 27 май 2005, 11:33
kdv
нету у нас обсуждений 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. К тому, что я сказал в этом топике, мне добавить нечего.
удалю топик чуть позже...
Добавлено: 27 май 2005, 11:46
McSSN
StrToDate('21/12/2005') - это я написал для примера.
На самом деле значение берётся из компонента, положенного на форму. Весь фокус именно "AsDateTime".
Когда я понял, что проблема в Delphi - вопро уже был задан.
Так что извиняйте. А вообще спасибо, что не отфутболили сразу.