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




Вниз

Вопрос по Query.Locate. 


Andrey007   (2001-12-29 10:31) [0]

Есть статический запрос. Нужно организовывать поиск по разным полям. Если я организовываю поиск по одному вещественному полю, то всё работает нормально, также как и когда поиск происходит по 5 полям, одно из которых символьное (Тип поля Char(25), тип программной переменной - String). Но вот когда я делаю поиск по двум символьным полям (оба типа Char(6)), то этот поиск работает только тогда, когда база является локальной (таблицы типа Paradox), то есть находится на том же компьютере, откуда запускается программа. А если поиск происходит в сетевой БД (сервер Oracle 8), то выполнение строки с Query.Locate приводит к появлению сообщения об ошибке "Operation not applicable.".

В целом дело обстоит так:

procedure Form1.Click(Sender: TObject);
var s1,s2: String;
begin
// тут происходит присвоение s1 и s2
if Query.Locate("CODE1;CODE2",VarArrayOf([s1,s2]),[]) then
begin
[...]
end
end;

s1 и s2 содержат заглавные русские буквы. Длина полей CODE1 и CODE2 - 6 символов. Причём в s1 и s2 в принципе не может быть более 5 букв, также как и в этих полях не может быть более 5 букв. Я предположив, что дело можно исправить дополнением s1 и s2 нужным числом пробелов, вставил перед Query.Locate дополнение пробелами:

if length(s1)<6 then
repeat
s1:=s1+" "
until length(s1)>=6;
if length(s2)<6 then
repeat
s2:=s2+" "
until length(s2)>=6;

Однако это не помогло,- по прежнему выполнение Query.Locate приводило к ошибке. Тогда я попробовал изменить тип s1 и s2 на String[6], но и это не помогло. Также не помогло и убирание добавления пробелов к s1 и s2 в испостаси String[6].

Что делать?



Val   (2001-12-29 10:43) [1]

используйте SQL



Yuvich   (2001-12-29 13:17) [2]

Попробуй вместо русских букв использовать латинские, если будет работать, то дело в локалях - или NLS_LANG или NLS_SORT или что-то подобное.



panov   (2001-12-29 14:25) [3]

Какой движок используешь?
При использовании BDE у меня такой вариант работает.



Andrey007   (2002-01-10 09:53) [4]

2 Val: именно SQL я и использую для написания этого запроса.

2 Yuvich: NLS_LANG в реестре в настройках клиента Oracle везде, кроме одного места стоял RUSSIAN_CIA.MSWIN1251 (цитирую неточно, поскольку пишу по памяти), я исправил в том месте, где стояло NLS_LANG=NA.
NLS_SORT в реестре я не нашёл и установил её как переменную среды в WinNT NLS_SORT=binary. Всё равно та же самая ошибка.

2 panov: при использовании BDE в локальном варианте у меня тоже всё нормально работает, а в сети при использовании сервера Oracle,- нет.



oname   (2002-01-10 10:45) [5]

Возможно, это связано с тем, что набор данных не полностью кэширован на локальной машине. Попробуй перед Query.Locate вызвать Query.RecordCount. Это закачает весь набор на машину. Только придется подождать, если набор большой.



panov   (2002-01-10 11:00) [6]

>Andrey007 (10.01.02 09:53)
У меня именно сервер ORCALE и используется.



Val   (2002-01-10 13:28) [7]

>Andrey007 (10.01.02 09:53)
я говорил не про запрос, а про поиск-select..., а потом проверка на пустоту Query..



Andrey007   (2002-01-10 18:16) [8]

Короче, ходил я к админу БД, он сказал, что дело не в Oracle, а в настройках BDE. Он определил это по сообщению, которое выдаёт Delphi, когда происходит эта ошибка. Сообщение такое:
Project R.exe raised exception class EDBEngineError with message "Operation not applicable." Process stopped. Use Step or Run to continue.
При запуске exe-файла, соответственно, выскакивает только "Operation not applicable."
В настройках BDE я пробовал менять Configuration->Drivers->Native->Oracle->VENDOR INIT. Было ORA805.DLL, админ посоветовал поставить OCI.DLL. Не помогло. Также пробовал менять на другие DLL, которые были в вываливающемся списке. Тоже не помогло.



Andrey007   (2002-01-10 18:21) [9]

P.S. Вот точное значение NLS_LANG = RUSSIAN_CIS.CL8MSWIN1251



Val   (2002-01-10 18:47) [10]

Да..прошу прощения за предыдущие сообщения - почему-то упорно не замечал, что локейт идет по квери (торможу...):((



fnatali   (2002-01-11 07:00) [11]

>Andrey007
А ты попробуй не менять VENDOR INIT из списка, а посмотри прямо в оракловом клиенте на своей машине, какая используется dll и напиши её ручками. У меня, например, для Oracle 8.1.7 используется c:\orawin95\bin\ociw32.dll
Не знаю, поможет тебе это или нет.



Andrey007   (2002-01-11 10:25) [12]

OCIW32.DLL я тоже пробовал. Тоже не работает.




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




Наверх





Память: 0.74 MB
Время: 0.05 c
3-18707           amamed_3071           2002-01-09 16:53  2002.02.07  
Error loading Midas.dll (Win98)


1-18913           Reals                 2002-01-21 19:53  2002.02.07  
Как подцепить в процедуру копирования файла ProgressBar...


6-18933           ev                    2001-11-10 01:43  2002.02.07  
как узнать МАК-адрес сетевой карты


1-18903           Ольга                 2002-01-22 17:18  2002.02.07  
Delphi 6


4-19016           IgorBIK               2001-12-09 19:28  2002.02.07  
Как вывести потоковый звук?