Текущий архив: 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.46 MB
Время: 0.043 c