Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Юникоды и компонент TOracleQuery   Найти похожие ветки 

 
Orxan   (2006-08-29 09:35) [0]

Мастера помогите пожалуйста с проблемкой.
БД- оракл 10g, делфи 5, компоненты TntUnicodeControls_2_1_11 и doa.

Данные в таблице содержатся в юникодах. Селектирую из таблицы. понимаю, что

     TntEdit1.Text:=Q.FieldasString("А");

уже не юникод. и выводится знак вопроса в не стандартных символах.
при написании

     TntEdit1.Text:=Q.Field("А");

уже выводится непонятный символ вместо "?".

помогите пожалуйста разрешить проблемку, может ктото встречался.

Спосибо.


 
sniknik ©   (2006-08-29 11:21) [1]

asString уже не юникод (от переобразований внутри метода/выдаваемого типа), на самом деле даже asVariant не гарантия... видел реализацию компонент где он из строки же и делался... что в общемто оправдано там было, работа с dBase у которого запись это большая строка, а значения полей это просто части с разными смещениями из этой строки.
это к тому что смотри доки самого TOracleQuery (вернее пакета доа к которому он относится) на предмет поддержки этим пакетом юникода в принципе.
ну или переходи на ADO где он гарантированно поддерживается.


 
ANB ©   (2006-08-29 11:22) [2]

NLSLANG настрой. Оракл сам все преобразует. По идее.


 
ANB ©   (2006-08-29 11:24) [3]

Проверь текст полей в тоаде или девелопере и только после этого начинай мучится с DOA.


 
Orxan   (2006-08-29 13:57) [4]

поменял на адо.  но опять же при присваивании значения этого поля в тнтедит показвает " ї "

 tntedit1.Text:=adoQuery1field1.Value;


 
ANB ©   (2006-08-29 14:00) [5]


> Orxan   (29.08.06 13:57) [4]

Для тех, кто в танке еще раз - в девелопере или тоаде все хорошо ?
ЗЫ. Не надо через ADO с ораклом работать при наличии хотя бы DOA.


 
Orxan   (2006-08-29 14:04) [6]

в тоаде тоже плохи дела. тотже символ выводится.


 
ANB ©   (2006-08-29 14:04) [7]


> Orxan   (29.08.06 14:04) [6]

См.
> ANB ©   (29.08.06 11:22) [2]


 
Orxan   (2006-08-29 14:09) [8]

а как?


 
ANB ©   (2006-08-29 14:12) [9]


> Orxan   (29.08.06 14:09) [8]

Ищещь в реестре поиском параметр NLSLANG (он там может встречатся не один раз). И правильно его настраиваешь : AMERICAN_AMERICA.CL8MSWIN1251.

Перед тем засунь в блокнот старое значение параметра (и запости его сюда).
Как правило, в результате сообщения об ошибках оракла станут английскими, но это даже лучше.


 
ANB ©   (2006-08-29 14:13) [10]

Упс, это. Параметр NLS_LANG называется. И переконнектится не забудь.


 
Sergey13 ©   (2006-08-29 14:19) [11]

> [10] ANB ©   (29.08.06 14:13)

Похоже ему не это надо.

> [6] Orxan   (29.08.06 14:04)
Я не работал ни с юникодом ни с 10-кой, но на
http://www.sql.ru/forum/actualtopics.aspx?bid=3
поиск по "UNICODE" дает несколько страниц топиков.


 
ANB ©   (2006-08-29 14:23) [12]


> Sergey13 ©   (29.08.06 14:19) [11]

тоад сам понимает юникодные поля. Если в нем неправильно показывает, проблема либо с NLS_LANG на клиенте, либо кривая база.

Но не факт, что когда заработает тоад, заработает делфовая программа :)
Просто проблемы надо решать поэтапно.

Кстати, Oracle XE автоматом все русские буквы перекидывает в юникод. При этом с одаком проблем не возникало.


 
Orxan   (2006-08-29 14:31) [13]

в реестре только в одном месте у меня стоял
AMERICAN_AMERICA.WE8MSWIN1252
а в остальных местах N/A


 
ANB ©   (2006-08-29 14:34) [14]


> Orxan   (29.08.06 14:31) [13]

Тады все понятно. У тебя русский язык порубан был. Воткни везде то, что я написал и проверь, что получилось в тоаде.
Кстати, оракла то какая ? Надеюсь не локализованный XE ?


 
Orxan   (2006-08-29 14:57) [15]

не локалка.
Я прогу не для себя пишу, и поэтому мне турецкие буквы нужны.
я прописал везде AMERICAN_AMERICA.WE8MSWIN1252 потому что этим чарсетом устанавливали оракл. но опять проблемка не разрешилась


 
ANB ©   (2006-08-29 15:03) [16]

Для тех, кто в танке - третий раз. У тебя указана западноевропейская кодировка и, есно, ничего не работает. Я ж написал, что воткнуть : AMERICAN_AMERICA.CL8MSWIN1251.


 
Orxan   (2006-08-29 15:10) [17]

воткнул везде  AMERICAN_AMERICA.CL8MSWIN1251
теперь знаки вопроса вышли


 
ANB ©   (2006-08-29 15:17) [18]


> Orxan   (29.08.06 15:10) [17]

Значит сервак таки локализованный обычный и при создании БД/инстанса указали западно-европейскую кодировку. Базу пересоздавать надо. А еще кто-нибудь на этой базе работает без проблем ?


 
sniknik ©   (2006-08-29 15:21) [19]

> поменял на адо.  но опять же при присваивании значения этого поля в тнтедит показвает " ї "
а ї это уже не вопросы (ошибки преобразований) это уже юникод, только не установленная на машине страница похоже (тогдо оно приводит к максимально похожей, но...).

возми ту, что у тебя есть (разные сайты пооткрывай) но точно юникодовскую, и сначала запиши в базу, после прочитай, должно быть одно и тоже... если нет, значит неправильно сделал. когда получиш номальную строку на выход замени tnt компонент на стандартный (убедится что юникод, он опять вопросами станет)
если все работает (и пишеш и чатаеш) то можеш смело прогу куда хочеш отправлять у них будет также.

> ЗЫ. Не надо через ADO с ораклом работать при наличии хотя бы DOA.
а ты уверен что он поддерживает юникод? я нет.


 
ANB ©   (2006-08-29 15:22) [20]

Еще можешь вот так попробовать RUSSIAN_CIS.CL8MSWIN1251.

Кстати, проведи эксперимент - создай тестовую таблицу с varchar2 полем и поковыряй ее на предмет русских букв.


 
ANB ©   (2006-08-29 15:24) [21]


> а ты уверен что он поддерживает юникод? я нет.

Я - тоже нет. Но одак прекрасно лопал ANSI, оракла сама конвертила в юникод и обратно. Критичен ли тут именно юникод на клиенте ?


 
Orxan   (2006-08-29 15:24) [22]

да есть готовая прога на жаве написана, без проблем работает. так что пересоздавать не получится.
да вот эта прога первая, и такая проблемка. да указывали  западно-европейскую кодировку, поэтомуто я прописывал AMERICAN_AMERICA.WE8MSWIN1252

спосибо за помощ.


 
sniknik ©   (2006-08-29 15:29) [23]

> Критичен ли тут именно юникод на клиенте ?
да, критичен. т.к. 3 используемых языка насчитал (английский (всегда есть), русский (ну не на турецкой же винде разработка), турецкий (нужен))


 
Orxan   (2006-08-29 16:07) [24]

не, винда английская стоит.
попытаюсь через адо опять сделать.


 
Anatoly Podgoretsky ©   (2006-08-29 16:07) [25]

ANB ©   (29.08.06 15:24) [21]
Конечно, конвертирование ANSI туда и обратно базируется на текущей локализации сторон. Если языков более двух, то вообще невозможно.


 
Anatoly Podgoretsky ©   (2006-08-29 16:09) [26]

Orxan   (29.08.06 16:07) [24]
Не играет роли, роль играет только текущая локализация, при том для конкретного потока, возможно даже разные локализации в разных потоках, кроме того еще вмешивается и сервер, если ANSI поступает в него.


 
ANB ©   (2006-08-29 16:16) [27]

Текс. Насколько я помню, при работе с юникодом нужно ораклу явно указывать, что строка в юникоде. Что то в этом роде DOA обязан поддерживать.


 
Anatoly Podgoretsky ©   (2006-08-29 16:18) [28]

ANB ©   (29.08.06 16:16) [27]
Я не знаю Оракл, но думаю что это так, поскольку с других именно так и в разных по разному указывается, при том это относитстя не только к Юникоду, но особенно к ANSI


 
ANB ©   (2006-08-29 16:25) [29]

Текс. Провел эксперимент на 8-ке.

create table Table1_T (ID number, S nvarchar2 (2000))

select dump(S) from Table1_T

select S from Table1_T

update Table1_T
set S = "Вася"

update Table1_T
set S = N"Петя"

Жрет и васю и петю и показывает все по русски. Работал в тоаде. dump показывает, что строка лежит в юникоде.


 
ANB ©   (2006-08-29 16:26) [30]

Кстати, помнится 9-ка хотела явного указания N"". Без этого работать не хотела. Не помню, как я через параметры это запихал, но запихал.


 
ANB ©   (2006-08-29 16:27) [31]

Вру - эсперимент это я провел на 9.2. Запутался я с нашими серваками.


 
Anatoly Podgoretsky ©   (2006-08-29 16:28) [32]

Конечно в Юникоде, не не может запрос изменить тип поля.
Второй запрос гарантирует правильность, а вот первый нет, будет зависить от текущей локализации. Попробуй установи кодовую кодировку для клиента отличной от русской, например 1252 и повтори эксперимент.


 
ANB ©   (2006-08-29 16:34) [33]

попробовал - не могу законнектится :)


 
sniknik ©   (2006-08-29 16:42) [34]

> Жрет и васю и петю и показывает все по русски.
а теперь, на бис, то же самое для молдавского/грузинского/любого какой найдеш но не русского языка! (и не английского. знаем вас...)
;о))


 
Orxan   (2006-08-29 16:44) [35]

на 1252 пробовал, тоже самое получилось


 
Anatoly Podgoretsky ©   (2006-08-29 16:49) [36]

ANB ©   (29.08.06 16:34) [33]
Ну тебе не повезло, а если бы смог, то Петю бы не увидел.


 
Anatoly Podgoretsky ©   (2006-08-29 16:49) [37]

Orxan   (29.08.06 16:44) [35]
Тебе доверия нет.


 
ANB ©   (2006-08-29 16:56) [38]


> sniknik ©   (29.08.06 16:42) [34]

А как по молдавски в тоаде набрать то ?


> Anatoly Podgoretsky ©   (29.08.06 16:49) [36]

Попробовал на 1250 - коннект прошел, но ничего не сломалось.

Короче - надо N писать перед константой, как это в параметр запихать - х.з., не помню. Есть смысл сходить на SQL.RU и поспрошать тамошних знатоков.

Автор - проведи эксперимент по образцу и подобию. И запости результат.


 
Anatoly Podgoretsky ©   (2006-08-29 17:04) [39]

ANB ©   (29.08.06 16:56) [38]
Короче - надо N писать перед константой, как это в параметр запихать - х.з., не помню.

Естесвенно, только это гарантирует правильность, а написать примерно так
"set S = N:P"


 
ANB ©   (2006-08-29 17:13) [40]


> "set S = N:P"

Не а. Так не жрет.


 
sniknik ©   (2006-08-29 17:14) [41]

> А как по молдавски в тоаде набрать то ?
не знаю... я для проб искал любой "вражеский" сайт на ихних буквах, и копировал через буфер.
пример с сайта TNT приблизительно и отражает что у меня получалось
http://www.tntware.com/delphicontrols/images/UnicodeWindows.gif
(только естесвенно я эти "кракозябры" не подписывал - язык такойто..., достаточно было того, что то что в базу положил то и получил назад)


 
Orxan   (2006-08-29 17:20) [42]

Anatoly Podgoretsky ©   (29.08.06 16:49) [37]

AMERICAN_AMERICA.WE8MSWIN1252 этим пробовал


 
sniknik ©   (2006-08-29 17:21) [43]

да и кстати, я не в жабе пробовал... и не с ораклом, а в своей тестовой программе c базами акесс, mssql и вроде бы firebird (смутно, tnt стоял очень недолго, фактически, проверил, сразу получилось без проблем и тутже удалил чтобы случайно от него ничего в проекты рабочие не "подцепить", а проверял на всем что под руку попалось в тот момент)


 
ANB ©   (2006-08-29 17:55) [44]


> Orxan   (29.08.06 17:20) [42]

Ща то какой NLS стоит ?


 
Orxan   (2006-08-29 18:43) [45]

> ANB ©   (29.08.06 17:55) [44]
AMERICAN_AMERICA.WE8ISO8859P9


 
Anatoly Podgoretsky ©   (2006-08-29 20:05) [46]

sniknik ©   (29.08.06 17:21) [43]
Я использую TNT без проблем


 
ANB ©   (2006-08-30 09:19) [47]


> AMERICAN_AMERICA.WE8ISO8859P9

Ну дык с такой кодировкой ты никогда русских букв не увидишь.


 
Val ©   (2006-08-30 11:50) [48]

>[47] ANB ©   (30.08.06 09:19)
вроде автор упорно хочет увидеть турецкие буквы, а вы ему русскую локаль настраиваете...зачем?


 
ANB ©   (2006-08-30 12:55) [49]

Задача вообщето решается настройкой сессии. В одаке это можно прямо в компоненте TOraSession вроде как все сделать (сам не пользовался, но что то подобное видел). В противном случае клиент будет пытаться сам преобразовывать юникод в строку и обратно.
Для проверки того, что легло в поле, удобно использовать функцию dump.
Кстати, про турецкий язык ничего не увидел :(


 
Orxan   (2006-08-30 13:11) [50]

ANB ©   (30.08.06 09:19) [47]
а мне не русские то буквы нужны. их я без проблем вижу.

Значит просмотрел кодировку каждого символа, который не нормально показывался. Оказалось, что при написании вручную этих символов в TNT цифровой эквивалент отличается от эквивалента, которого я получаю из таблицы. Всего таких символов 8. пришлось написат процедурку, которая заменяет иероглифы на нормальные буквы при выводе в TNT. вроде заработало.
Разницы никакой при использовании адо оли доа компонентов.

Спосибо всем, кто пытался помочь.



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.03 c
6-1149961804
anton773
2006-06-10 21:50
2006.10.29
преобразовать IP адрес


2-1160668978
redlord
2006-10-12 20:02
2006.10.29
в каком потоке работает ServerSocket1ClientRead


3-1157012836
SergP.
2006-08-31 12:27
2006.10.29
Не получается выполнить процедуру.


2-1160982536
mva
2006-10-16 11:08
2006.10.29
Языковая панель


2-1160859990
redlord
2006-10-15 01:06
2006.10.29
процедуры с одним именем но с разными типами переменных