Форум: "Базы";
Текущий архив: 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