Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Unicode+Ado+Oracle   Найти похожие ветки 

 
BigSerg ©   (2005-10-27 21:56) [0]

Hello, All!

Жила - была база, преспокойно
работающая как на MS-Sql , так и на  Oracle через ADO.
Пресветлое начальство поставило
задачу интернационализировать ее, то
есть все строковые значения заменить
на Unicode.
И тут такое началось :(((
На (MsSql +Ado) все блястить -сверкаеть, на компонентах прямого доступа(Oracle + Oracle Direct Access (Odac)) аналогично , но на (Oracle+Ado) началось самое неприятное и интересное.

Delphi 6, Oracle 9 server.

1) Установить (после чтения мануалов до
просветления, и обрыскивания Интернет)
поддержку юникода для Oracle 9 client Ole Db Provider не удалось Ресультат дал только Oracle 10 client.
Solution: Ладно, поставим  Oracle 10 client, мы не гордые.

2) TAdoQuery.Parameters.Refresh &  TAdoStoredProc.Parameters.Refresh в лучшем случае очищают список Parameters, в худшем зависают. They only clear  Parameters collection.
Solution: Ладно , создадим параметры
вручную, мы опять же не гордые.

3) Меняем тип параметра(согласно
рекомендациям собаководов)  TParameter.DataType в TAdoQuery на ftWideString. Но он  ftFixedChar, хоть ты тресни.

4) Согласно Oracle Ole DB Provider Manual использовать параметры в WHERE нельзя (допустим выбрать человека по имени)  С N`string" литералами в AdoDataset.CommandText тоже не сложилось
Solution: Ладно, будем использовать UNISTR в AdoDataset.CommandText, мы опять же не гордые (хотя функция внедрена только с Oracle 9)

5) Примитивная форсма DBGrid - Datasource - AdoDataset AdoDataset.CommandText:= "select * from some_table"
some_table - таблица с первичным ключом.
Работает, пока меняем любые поля, кроме
полей с NVARCHAR2 .
Иначе получаем милый exception "Row cannot be located for updating. Some values may have been changed since it was last read"
Интересно, что с полями типа VARCHAR и NCHAR такого не происходит.
Solution: Шо с ним делать, ума не приложу.

У кого есть нормальный положительный
опыт работы с  Unicode+ Ado+ Oracle?
Посоветуйте плиз что-нибудь.
With best regards, Serg Soorskih.  E-mail: very_big_serg_cutcut@mail.ru


 
Nikolay M. ©   (2005-10-27 22:12) [1]

Лучше сюда, тут специалисты тусуются:
http://www.sql.ru/forum/actualtopics.aspx?search=unicode&bid=3
NVARCHAR2 в сабже пару раз упоминается.


 
sniknik ©   (2005-10-27 22:26) [2]

опыта как такового с Oracle нет (тесты не считаются),  с Unicode практически аналогично но... что значит "Row cannot be located for updating. Some values may have been changed since it was last read"
случайно знаю. ;о))

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

не знаю понятно, нет обьяснил но неважно, обойти ситуацию гораздо проще чем понять. всего то, надо иметь ключевое поле в запросе, и указать ADO чтобы определение соответствия записи в рекордсете и базе строилось по нему. после открытия команда
ADODataSet1.Open;
ADODataSet1.Properties["Update Criteria"].Value:= adCriteriaKey;
и все.


 
BigSerg ©   (2005-10-28 12:55) [3]

To sniknik
Спасибо дорогой товарищ, рецепт:

> ADODataSet1.Open;
> ADODataSet1.Properties["Update Criteria"].Value:= adCriteriaKey;
>
> и все.

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

Правда , пункты 1)- 4) открыты, может, кто чего скажет?


 
Курдль ©   (2005-10-28 13:12) [4]


> 4) Согласно Oracle Ole DB Provider Manual использовать параметры
> в WHERE нельзя (допустим выбрать человека по имени)  С N`string"
> литералами в AdoDataset.CommandText тоже не сложилось
> Solution: Ладно, будем использовать UNISTR в AdoDataset.
> CommandText, мы опять же не гордые (хотя функция внедрена
> только с Oracle 9)


Это почему параметры нельзя? Разве where SBJ_NAME = ?
отменили?
А потом command.Parameters.Add("_NAME", 1)
Или я вопрос не понял?


 
BigSerg ©   (2005-10-28 13:30) [5]

То Курдль

http://download-west.oracle.com/docs/cd/B10501_01/win.920/a95498/using.htm#1010255
OraOLEDB does not support parameters of N datatypes in the WHERE clause of SQL statements.

Именно поэтому и не работало  редактирование Unicode - полей без указания
ADODataSet1.Properties["Update Criteria"].Value:= adCriteriaKey;



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

Форум: "Базы";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
6-1125328100
ctudentnew
2005-08-29 19:08
2005.12.11
Как отправить фото на сервер


1-1131895138
zxc
2005-11-13 18:18
2005.12.11
чем еще можно рисовать


14-1131710280
BOA_KAA
2005-11-11 14:58
2005.12.11
На какую з/п?


1-1131744155
злобная танька
2005-11-12 00:22
2005.12.11
текст под углом


14-1132252990
DK2DK2DK2
2005-11-17 21:43
2005.12.11
поднять свой сервер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский