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

Вниз

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

Наверх




Память: 0.47 MB
Время: 0.014 c
3-51612
PeregudSergey
2002-11-28 04:06
2002.12.16
TADOStoredProcedure error


1-51757
botza
2002-12-04 18:48
2002.12.16
ne zapuskaetza file


6-51867
guest_xxx
2002-10-21 12:40
2002.12.16
Disk quotas NT 4


14-51887
vopros
2002-11-19 10:54
2002.12.16
Господа, программисты придумываеться сценарий.


3-51632
Fishka
2002-11-28 14:38
2002.12.16
Длина имени таблицы в INTERBASE -?