C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Перенос русских слов из одной базы в другую.
andruxa-xaxa
Отправлено: 11.03.2007, 12:11


Ученик-кочегар

Группа: Участник
Сообщений: 17



Мне надо перенести данные таблицы Paradox в таблицу Intrbase.
Таблица Paradox содержит русские слова. При попытке программно вставить запись в Intrbase
содержащую русские слова выдается ошибка "...exception EDBEngineError with message 'General SQL error.
arithmetic exception,numeric overflow, or string truncation
Cannot transliterate character between character sets'.
Я использую компонент TQuery, формирую запрос insert into t(field0) values(:field0)
и затем присваиваю Query->Params->ParamValues[ "field0" ] = val
Переменная val содержит русское слово.
Я попробовал вставить русский текст напрямую через Interactive SQL и все прошло нормально.
Язык таблицы Paradox : Cyrr 866, Intrbase CYRL.
Если кто встречался с такой проблемой подскажите пожалуйста.
olegenty
Отправлено: 12.03.2007, 10:11


Ветеран

Группа: Модератор
Сообщений: 2412



найди и воспользуйся IBDataPump
ion
Отправлено: 12.03.2007, 13:18


Ученик-кочегар

Группа: Участник
Сообщений: 15



скорее всего проблема с кодировакой, при тарансляции,происходит переворот, стоит обратить внимание, какая кодировака у IB
какая кодировка у таблици IB.
если cp1251->utf8 то это болезненоое преобразование
ion
Отправлено: 12.03.2007, 13:19


Ученик-кочегар

Группа: Участник
Сообщений: 15



попробуй прямо в скуле указать желаемую кодировку
Tantos
Отправлено: 12.03.2007, 15:55


Станционный диспетчер

Группа: Участник
Сообщений: 108



Как вариант — посмотри длины строковых полей в обоих таблицах.
Admin
Отправлено: 12.03.2007, 16:07


Владимир

Группа: Администратор
Сообщений: 1190



1. Посмотрите у этих полей OemToAnsi() или AnsiToOem()
то есть предварительно перд вставкой применить к
val эту функцию.

Query->Params->ParamValues[ "field0" ] = OemToAnsi(... val...)

2. Или у драйвера Paradox выставить эту кодировку на время
конвертации, а потом вернуть как было.
Посмотрите в SQL Explorer как видны эти поля в таблице -
нормально или кракозябликами.

Также нужно поиграть со свойством transliterate у поля,
возможно выставить его в false при этих конвертациях.
andruxa-xaxa
Отправлено: 15.03.2007, 20:51


Ученик-кочегар

Группа: Участник
Сообщений: 17



QUOTE (olegenty @ 12.03.2007, 10:11)
найди и воспользуйся IBDataPump

Не могу — мне надо именно программу написать.
andruxa-xaxa
Отправлено: 15.03.2007, 21:18


Ученик-кочегар

Группа: Участник
Сообщений: 17



QUOTE (Admin @ 12.03.2007, 16:07)
1. Посмотрите у этих полей OemToAnsi() или AnsiToOem()
то есть предварительно перд вставкой применить к
val эту функцию.

Query->Params->ParamValues[ "field0" ] = OemToAnsi(... val...)

2. Или у драйвера Paradox выставить эту кодировку на время
конвертации, а потом вернуть как было.
Посмотрите в SQL Explorer как видны эти поля в таблице -
нормально или кракозябликами.

Также нужно поиграть со свойством transliterate у поля,
возможно выставить его в false при этих конвертациях.

Я попробовал функцию OemToAnsi и AnsiToOem к строке, изначальное значение из Paradox нормально выводилось с помощью ShowMessage() а после этих функций выводится кракозяги какие-то, и все равно выдает ошибку.
А для Paradox через DatabaseDesktop я поменял кодировку с Paradox Cyrr 866 на Paradox 'ascii' и все строковые данные таблицы исказились.
Свойство transliterate — это свойство какого объекта?
Admin
Отправлено: 18.03.2007, 12:10


Владимир

Группа: Администратор
Сообщений: 1190



Свойство поля. (для того поля где русский текст)

Чудес не бывает, смотрите что неправильно делаете.
Если смотреть таблицу через обычную связку Table->DataSource->DBGrid — эти
поля выводятся на русском или кракозябликами ?

Вернуться в Работа с базами данных в C++Builder