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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.055 c
2-1132935214
Jimm
2005-11-25 19:13
2005.12.11
Как пользоваться Utf8ToUnicode?


4-1128515659
Alek
2005-10-05 16:34
2005.12.11
message в dll


2-1131985995
Dudee
2005-11-14 19:33
2005.12.11
Сохранить в файл данные разных типов


2-1132816955
Андрюша
2005-11-24 10:22
2005.12.11
e в степени ln(x)? Как сделать?


1-1131624295
ASScef
2005-11-10 15:04
2005.12.11
Рисование на Canvas