Главная страница
    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.007 c
4-52010
Алексей Ким
2002-11-02 10:23
2002.12.16
menu


4-52005
Demn
2002-11-03 07:13
2002.12.16
Как вызвать системное окошко с пропертисами файла


8-51836
sergn
2002-08-30 15:50
2002.12.16
Разворот метафайла


1-51709
lovres
2002-12-05 23:49
2002.12.16
Помогите с элементарным классом


7-51983
dronas555
2002-10-15 01:30
2002.12.16
Память





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