Текущий архив: 2003.10.30;
Скачать: CL | DM;
Вниз
InterBase Найти похожие ветки
← →
Ru © (2003-10-10 13:35) [40]>Анонимщик © (10.10.03 13:30) [39]
автор вопроса благоволучно сделал:
function TData.GetTabCnt(input: TIBDataSet): integer;
var
cn:integer;
begin
{отримати кількість записів у таблиці}
cn:=input.RecNo;
input.Last;
result:=input.RecNo;
input.First;
input.MoveBy(cn);
end;
И автора вопроса волнует другой вопрос: в чем состоит глюк, что не работает IBDataSet1.Next; ?
← →
Анонимщик © (2003-10-10 13:46) [41]Точно нэ працюе? Наскилькы я розумию, всэрэдини Next выклыкаеться MoveBy(1). Тоди б и MoveBy не працювало. Спробуй трасиювання.
← →
Delirium^.Tremens © (2003-10-10 13:46) [42]
> Ru © (10.10.03 13:35) [40]
> >Анонимщик © (10.10.03 13:30) [39]
>
> автор вопроса благоволучно сделал:
> function TData.GetTabCnt(input: TIBDataSet): integer;
> var
> cn:integer;
> begin
> {отримати кількість записів у таблиці}
> cn:=input.RecNo;
> input.Last;
> result:=input.RecNo;
> input.First;
> input.MoveBy(cn);
> end;
Зачем так много текста для какой-то фигни?
> И автора вопроса волнует другой вопрос: в чем состоит глюк,
> что не работает IBDataSet1.Next; ?
WHILE NOT ...EOF DO
BEGIN
...
NEXT;
END;
Не работает?
И слава богу, так издеваться над пользователем, чтобы сообщить ему количество записей в таблице....
Все работает. Выкини свой код и поставь отдельный кверь для SELECT COUNT(*). Получи из него искомое количество. Уже столько мастеров об этом сказало, а ты все за свое.
← →
Danilka © (2003-10-10 13:52) [43][35] Анонимщик © (10.10.03 12:59)
:)
Alexandr ©
Johnmen ©
Засомневался, спосил на скл.ру, блокировочник он или версионник, получил вот-такие ответы:
Violina
Почему Оракл не блокировочник
1) Чтнение не блокирует запись. Пример, если изменяются данные, которые нужны долгоиграющему запросу, то изменение не блокируется, восстанавливается старая версия данных на момент начала запроса из сегмента отката.
2) Запись не блокирует чтение. В случае необходимости, восстанавливается старая версия данных на момент начала запроса из сегмента отката.
Пуп
Более того, Том Кайт в своей книге подробно объясняет, каким образом умудряется обеспечивать такой низкий уровень блокировок и такой высокий уровень конкурентности. В Оракл блокировки это атрибут данных, блокировки не управляются всякими там менеджерами или агентами, которые бы вызывали bottle necks при обращении к ним.
Представьте ресторан со 100 столиками, на каждом стоит чайник. Задача - напоить чаем 1000 человек. Есть 4 официанта (менеджера блокировок). Если чай могут разливать только они, то представьте как им придется бегать и как многим придется ждать. Альтернативный вариант (как в Оракл) - каждый посетитель наливает себе чай сам и не ждет.
Пример, проапдейтили очень много строк, было наложены блокировки. Транзакция закомичена, все эти блокировки снимать - только систему нагружать. Последующие процессы при обращении к данным просто снимут их сами (только с нужных им данных), определив что они уже не действительны. Такм образом вместо аврала по очистке блокировок, это равномерно распределяется по времени не оказывая ощутимого влияния на производительность.
← →
Danilka © (2003-10-10 13:58) [44]Вдогонку, посоветовали почитать про вот-эти орокловые фичи:
flashback database - возможность запрашивать базу данных по состоянию на момент времени в прошлом (например час назад).
workspace management - версионирование таблиц в рабочих пространстрвах. Слияние версий и разрешение кофликтов.
← →
Johnmen © (2003-10-10 14:05) [45]>Danilka © (10.10.03 13:52)
И что ?
← →
Danilka © (2003-10-10 14:09) [46][45] Johnmen © (10.10.03 14:05)
То что он версионник, а не блокировочник.
← →
sts © (2003-10-10 14:28) [47]Danilka © (10.10.03 14:09) [46]
УРА!!!
← →
sts © (2003-10-10 14:37) [48]Ru © (10.10.03 13:35) [40]
>Анонимщик © (10.10.03 13:30) [39]
автор вопроса благоволучно сделал:
function TData.GetTabCnt(input: TIBDataSet): integer;
<skipped>
Автора еще должен волновать вопрос можно ли то же самое сделать проще:
function TData.GetTabCnt(input: TIBDataSet): integer;
begin
input.FetchAll;
result:=input.RecordCount;
end;
← →
Ru © (2003-10-10 14:50) [49]>sts © (10.10.03 14:37) [48]
В первую очередь автора интересует возможность отделаться от данного задания по-быстрее. А так как требований к эффективности кода, да и работы абсолютно никого не интересует, то и я не сильно переживаю по поводу данного вопроса. Автора, как и его начальство интересует работоспособность и главное соответствие результата истинному положению вещей.
Автор учтет ваши рекомендации при реализации последующих проектов, либо, если будет такая возможность, в данном.
Автор выражает благодарность всем принявшим участие в обсуждении. Особенно тем, кто подсказал что именно надо делать (автора совсем не волнуют слова "версионник" и "блокировочник", так как они не входят в обязательный набор информациии необходимой для решения текущей задачи).
← →
Johnmen © (2003-10-10 14:50) [50]>Danilka © (10.10.03 14:09)
Странно:
1. Ты доверяешь высказыванию неизвестных личностей
2. Из их высказываний абсолютно не следует тот вывод, который ты сделал.
Оракл - блокировочник, но не в чистом виде. С элементами версионника. И эти элементы существенны.
используя
Из книги:
"ORACLE автоматически поддерживает одновременный доступ и точность информации в многопользовательском окружении базы данных, - используя блокировки, транзакции и многоверсионную модель согласованности данных."
← →
Danilka © (2003-10-10 15:04) [51][50] Johnmen © (10.10.03 14:50)
Просто я сам себя считаю слабым ороклистом, работаю с ним чуть больше года как программер и разработчик БД и все это время слышал что он версионник. Поэтому и спросил в форуме, к котором есть опытные ороклисты. Та-же Violina недавно сдала экзамены на ОСР (незнаю что это такое :)) но видимо что-то хорошее - все ее поздравляли).
То что это гибрид версионника и блокировочника, там уже тоже сказали:
Oracle - гибрид версионника и блокировачника.
Чистый версионник в теории Concurency and Recovery,вообще не ставит блокировок, каждая транзакция работает со своей версией данных, конфликты решаются при COMMIT.
Это достаточно "дорогое" решение, значительно дешевле обычно оказывается предотвратить конфликт, чего Oracle добивается блокировками.
Ссылка на ветку:
http://www.sql.ru/forum/actualthread.aspx?bid=3&tid=53089
← →
Delirium^.Tremens © (2003-10-10 15:18) [52]
> Danilka © (10.10.03 15:04) [51]
> Oracle - гибрид версионника и блокировачника.
Рассуждения в вашем оффтопике напоминают мне спор двух четвероногих из рекламы:
- Сытное
- Нет, вкусное
:-))))
← →
Danilka © (2003-10-10 16:10) [53][52] Delirium^.Tremens © (10.10.03 15:18)
А он и сытый и вкусный, вона как! :))
← →
Жук © (2003-10-10 16:51) [54]
> Delirium^.Tremens © (10.10.03 13:46) [42]
> Все работает. Выкини свой код и поставь отдельный кверь
> для SELECT COUNT(*). Получи из него искомое количество.
> Уже столько мастеров об этом сказало, а ты все за свое.
Это кто же ему такое говорил ? Наоборот так не надо делать.
← →
Anatoly Podgoretsky © (2003-10-10 17:23) [55]Жук © (10.10.03 11:45) [21]
Жук © (10.10.03 16:51) [54]
И наоборот представб ситуацию, когда запрос выполняет за миллисекунды и потом нудно по сети перекачивается на машину, много записей, в этом случае COUNT оптимальнее.
Никто не говорил абсолютно надо использовать или нет, говорили абсолютно другое - it"s depended
Запрос запросу рознь.
← →
kaif © (2003-10-10 19:17) [56]2 Ru © (09.10.03 17:53)
Если бы ты спросил, как узнать количество записей в наборе, а не в таблице базы, я бы про SELECT COUNT(*) и не заикнулся. Я бы сказал, что ты забыл сделать FetchAll, Прежде чем смотреть свойство RecordCount. Кстати, IBX совершенно корректно дают RecordCount после FetchAll. Это стопудово.
Но ты спросил:
Как узнать количество записей в таблице базы (RecordCount стабильно выдает 1)
И углядел противоречие в самом вопросе.
Так как худший универсальный способ для любой таблицы узнавать количество записей в ней это как раз связываться с RecNo и выборкой всего набора на клиент, когда вместо этого существует SELECT COUNT(*). И никак из вопроса не понять, что нужно еще и данные получать, то есть о необходимости того, чтобы запрос о количестве записей стал бы вторым запросом.
Так что обижаться на длинное обсуждение не надо, формулируй запросы понятнее, сообщая хоть что-то из самой задачи и ответ получишь правильный и сразу.
← →
Zacho © (2003-10-10 19:18) [57]Извеняюсь, но после первых нескольких постов стал читать по диагонали :) Насмешили, блин :) Не, не все, а только некоторые :) Без обид, надеюсь...
← →
kaif © (2003-10-10 19:27) [58]Судя по ответам на вопросы, ты достаточно хорошо представляешь, как использовать IBX компоненты. Но я не знаю, в курсе ли ты, что в SQLЮ, как правило, мало применяются выборки всей таблицы типа
select * from <table>.
Обычно выборки имеют существенно меньшее число строк в наборе, чем таблицы, из которых они производятся. То есть выборки обычно бывают:
select * from <table>
where <условие отбора>
В этом случае правильно говорить о RecordCount не как о количестве строк в таблице, а как о количестве строк в данном наборе.
Поэтому и возникло подобие спора, так как не ясно, что же тебе нужно. Если у тебя таблица со 100тыс записей, а ты ищешь способ сделать Last на клиенте только для того чтобы узнать, сколько записей в таблице, то народ постарается тебя отговорить от этого мероприятия.
Страницы: 1 2 вся ветка
Текущий архив: 2003.10.30;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.064 c