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

Вниз

RecordCount на Oracle   Найти похожие ветки 

 
Соломатин Артем   (2002-11-27 22:30) [0]

Посмотрите, пожалуйста. Простенький исходник вот такого типа:

var
Query:TQuery;
V:Variant;
...
begin
with Query do
begin
SQL.Text:="SELECT * FROM SOME_TABLE WHERE SOME_ID=12";
Open;
if RecordCount>0 then
begin
...
V:=FieldValues["SOME_FIELD"];
...
end;
Close;
end;
end;

И вот что интересно: на двух одинаковых Оракловых базах этот скрипт дает разные результаты: в одном случае отрабатывает так, как будто RecordCount=0 и проскакивает мимо if " а, в другом -- как будто RecordCount>1 и входит внутрь if " а. Повторюсь: обе базы совершенно идентичны по структуре, по констрейнтам и содержанию.
При этом если выполнить указанный запрос напрямую через SQLPlus, то на обеих базах результат одинаковый и не пустой.
Более того, сама программа начинает одинаково хорошо работать на обеих базах, если убрать if и оставить вот так:

var
Query:TQuery;
V:Variant;
...
begin
with Query do
begin
SQL.Text:="SELECT * FROM SOME_TABLE WHERE SOME_ID=12";
Open;
...
V:=FieldValues["SOME_FIELD"];
...
Close;
end;
end;

В чем тут мб дело?
Заранее благодарен


 
oss   (2002-11-28 00:11) [1]

поставь
if not Query.IsEmpty then .....


 
Suntechnic   (2002-11-28 07:29) [2]

Да потому что использование RecordCount для клиент-серверных БД это не самая лучшая идея. Для начала советую почитать парней от Борланда

Use RecordCount with care, because record counting can be a costly operation, especially for SQL queries that return large result sets. Generally, an application should only use RecordCount with Paradox and dBASE tables.

Ну а теперь немного объяснения почему так. Дело в том, что RecordCount это всего лишь счётчик локально выгруженных записей. В случае с локальными БД это и есть общее количество записей. А в случае клиент-серверных БД для того чтобы посчитать записи их для начала надо на локальную машину выгрузить. Открытие же SQL запроса совсем не означает, что записи будут выгружены. Скорее даже наоборот. На сервере откроется курсор и установится на первую запись(или может кешировать локально, скажем, первые 20 записей зависит от самой имплементации) В любом случае для того чтобы выгрузить все записи надо пройтись крсором до последней (скажем выполнить команду FetchAll). Но смысла в этом особого нет поскольку при таком подходе вы теряете все преимущества клиент-сервеной БД перед локальной (о чём и пишут парни из Борланда).



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

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

Наверх




Память: 0.45 MB
Время: 0.006 c
1-51703
___Nikolay
2002-12-04 19:48
2002.12.16
Как вывести HINT в нужный момент с нужным текстом


6-51865
User911?
2002-09-18 13:37
2002.12.16
Как работать с TServerSocket используя режим ThreadBlocking?


1-51691
aterm
2002-12-04 13:11
2002.12.16
Какой код у клавиши delete


4-52000
izhalex
2002-10-30 09:58
2002.12.16
получение списка процессов


1-51671
Mihey
2002-12-05 16:19
2002.12.16
Создание dll-ки.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский