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

Вниз

MS SQL + Delphi   Найти похожие ветки 

 
Желтый карлик   (2003-03-04 21:52) [0]

Почему после выполнения StoredProc.RecordCount= -1
Когда это свойство можно использовать для определения числа записей?
Заранее благодарю.


 
Johnmen   (2003-03-04 23:18) [1]

Если по уму, то никогда...


 
Vladimir   (2003-03-05 07:59) [2]

Не знаю, как насчет MSSQL, но в ИБ так:
запрос select * from stored_proc делаем Open, потом для определения корректного числа записей (вся соль с тем, что клиент получает не все записи сразу, а дополучает их по необходимости, послему клиентская часть может и не знать, сколько записей у нее в запросе есть. Надо тогда после открытия делать Last, читаешь RecordCount, опять First. Все будет работать.


 
Fiend   (2003-03-05 10:23) [3]

надо бы сделать FetchAll и всё оперделится!


 
Wind2000   (2003-03-06 09:57) [4]

Господа, слово ВЫПОЛНЕНИЕ предполагает, что все данные профетчены. А результат -1 говорит о двух вещах - либо нет ни одной записи, набор пуст, либо при выполнении StoredProc произошла ошибка, но это уже надо обрабатывать.


 
BlackTiger   (2003-03-06 12:42) [5]

>Wind2000

А по-моему, всё наоборот. Результат "-1" (оно же "True") говорит, что записи ЕСТЬ, но их количество не известно на данный момент. Точное количество записей можно узнать только после "MoveLast;MoveFirst".


 
Дмитрий Баранов   (2003-03-06 13:45) [6]

RecordCount возвращается только если курсор это позволяет. Подробности в MSDN. Попробуйте перместить запрос в AdoQuery c CursorType = adOpenKeyset


 
Fiend   (2003-03-06 14:53) [7]

То Wind2000:
если процедура выполнилась, то это еще не означает шо весь набор данных, который она возвращает, уже получен клиентом.

Для того чтобы его получить надо сделать FetchAll.
Если бы во время выполнения процедуры произошла ошибка то человечище непременно увидел бы сообщение об ошибке.

А если она выполнилась и ничего не вернула то RecordCount=0, с какой стати -1? количество всегда с 1 отсчитывается.

А слово выполнение как вы говорите никогда не предполагает фетчинг данных на клиента. оно предполагает как раз ВЫПОЛНЕНИЕ, а фетч это уже другая операция


 
Y   (2003-03-06 16:15) [8]

открыть набор данных нужно: сначала Exec, потом Active:=true


 
Fiend   (2003-03-06 18:01) [9]

То Y:
это еще зачем?
шоб два раза выполнить процедуру?


 
Anatoly Podgoretsky   (2003-03-06 18:07) [10]

Не стоит расчитывать на это свойство, если что то и возвратило, то это просто везение. Количество записей надо получать запросом в котором использовать функцию Count


 
Желтый карлик   (2003-03-06 23:33) [11]

Господа,спасибо за участие!
Насчет Last-First - это есть не очень хорошо.
Вопрос в том, что после выполнения некой хранимо процедуры(в которой создавалась временная таблица с полем IDENTITY) RecordCount возвращал верное значение. В чем прикол? Верить или не верить RecordCount?


 
Johnmen   (2003-03-07 00:14) [12]

>Жирный карлик

Не верить ! Никогда и не при каких обстоятельствах !
Вообще забыть про RecordCount ! :)))


 
sniknik   (2003-03-07 00:21) [13]

Желтый карлик (06.03.03 23:33)
зависит от многих вещей курсор clUseClient/clUseServer, курсор тип, процедура (кем написана?), стоит SET NOCOUNT да/нет, если не стоит делаются вызовы на возвращающие записей, вызовы через какой компонент (ADOCommand иногда возвращает когда другие нет) и еще может чего упустил.
в общем случае (если от этого важное чтото зависит) то не верь. Делай Select count(*) ....

я делаю так (мне не важно :-))

ADOCommand1.CommandText:= sCommand;
Recordset:= ADOCommand1.Execute(RecordsAffected, EmptyParam);
if Recordset.State=1 then RichEdit2.Lines.Add(IntToStr(ErrCount)+" Выполнено применительно к "+IntToStr( Recordset.RecordCount)+" записям")
else RichEdit2.Lines.Add(IntToStr(ErrCount)+" Выполнено применительно к "+IntToStr( RecordsAffected)+" записям. (no recordset)");

(работает при ADOConnection1.CursorLocation = clUseClient)
sCommand - любая команда в том числе и процедуры, + еще нужно множественный рекордсет отработать, а то можеш не то количество поймать.


 
KSergey   (2003-03-07 15:58) [14]

Странно, за что люди не любите RecordCount? Пусть не всегда, но это же зависит от способа коннекта и настроек, т.е. в руках разработчика! Если не все в его руках - тогда другой вопрос, но когда все (и сервер, и метод поключения и т.д.) - то почему не пользоваться?!! Не понимаю...

Автор, к стати, не упомянул способ подключения. Но как-то все уже по умолчанию считают ADO...
Так вот по поводу ADO - при использовании клиентского курсора и не асинхронного выполнения - ну не было проблем с кол-вом записей. Может пока не было? Что я недопонимаю, объясните, пожалуйста...


 
Johnmen   (2003-03-07 16:05) [15]

Не рекомендуется пользоваться методами, которые могут то работать, то неработать.


 
KSergey   (2003-03-10 07:59) [16]

Что значит то работать то нет?
Работоспособность этих методов зависит от разработчика и реализацию им функциональности приложения.
Ну это как примерно разработать систему под MS SQL, а потом подсунуть ей MySQL и сказать: "А вот ерундовая система, ерундовыми методами написана: то работает, а то нет". Но предполаагется ведь, что задачи такой не было!


 
sniknik   (2003-03-10 08:39) [17]

KSergey © (10.03.03 07:59)
В том то и дело что не всегда от разработчика зависит.

ну к примеру если вынужден пользоваться чужими сторед процедурами, то будеш зависеть от их построения, поставят SET NOCOUNT один результат, непоставят другой, непонятно какое количество поймаеш. ну хорошо на месте можно и поправить, но смысл в программе которая только у тебя правильно работает? Бывает что программы ставят удаленнно причем вместе с блоком процедур поправленых(под себя, или они их пишут) твоими компаньенами (я вот в москве а филиал в питере, И?)

ну еще настроил ты систему работает она все на рекордкаунт или порядковый номер(того же порядка значения) завязано. и вдруг осазнал необходимость перейти на серверный курсор(с клиентским тоже не все методы работают), дальше? все переделывать. не лутше ли сразу не использовать?

не я не отговариваю, если понимаеш что почем юзай на здоровье, (я вот использую, (не везде)). сталкивался с разными непонятными вещами один и тот же запрос в ADODataSet возвращает в рекордкаунт -1 а выполненый в ADOCommand количество записей (запрос к сожалению вспомнить не могу). наверняка гдето чегото не учел, но закладыватся на это? в важных программах? если я так на месте не всегда могу найти почему, то как по телефону когда программа уже у клиента?


 
KSergey   (2003-03-10 12:32) [18]

Ну тогда видимо все зависит от того от чего плясать..
Я пляшу от того, что в этом конкретном мест использую RecCount - из этого и исхожу.
Если мне это не надо будет - из этого исходить не буду, разумеется.. Хотя пока проблем это не вызывало ни разу, к счастью: всегда было понятно почему оно работает (или не работает).



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

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

Наверх





Память: 0.49 MB
Время: 0.009 c
14-88170
R
2003-03-11 03:57
2003.03.27
Как вставить в свой компонент иконку


3-87874
Roki
2003-03-07 12:33
2003.03.27
Как в IB(FireBird) добавить ограничение на значение поля?


14-88147
kostya2000
2003-03-11 20:14
2003.03.27
3.14


14-88177
JibSkeart
2003-03-10 10:26
2003.03.27
Кто подскажет более менее неплохой халявный почт. ящик ?


14-88245
malkolinge
2003-03-12 16:02
2003.03.27
Книги по построению компиляторов !





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