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




Вниз

Количество RecordSet ов 


DmitryV   (2002-04-02 09:53) [0]

Привет всем!
Возник такой вот вопрос: как узнать количество возвращаемых сторедом рекордсетов? Никто с этим не сталкивался?

С уважением



DmitryV   (2002-04-02 17:09) [1]

Хм...
Это я вопросы задавать не умею или на самом деле никто не сталкивался :-)?



Lusha   (2002-04-02 17:21) [2]

Если сторед это хранимая процедура, а рекордсет - запись, тогда открыть набор данных и посмотреть RecordCount. :)



DmitryV   (2002-04-02 17:40) [3]

>Lusha ©
сторед - это на самом деле хранимая процедура, а вот рекордсет - это набор записей, причем структура возвращаемых рекордсетов, как правило, разная :-)



Lusha   (2002-04-02 17:45) [4]

Не понял. Одномоментно одной и той же хранимой процедурой возвращаются наборы записей разной структуры?



DmitryV   (2002-04-02 17:52) [5]

Угу
Пример: sp_helplogins
возвращает два набора данных, разных по структуре :-)



sniknik   (2002-04-02 17:54) [6]

в MSSQL можно так. и даже не в процедуре а в блоке несколько разнотипных селектов. в Query Analizer срабатывает. а как в Delphi не знаю.
DmitryV © тебе действительно нужна практика по заданию понятных вопросов!



Mike_Goblin   (2002-04-02 18:00) [7]

Как получить количество тоже не нашел, однако оно мне и не надо было.
Делал цикл while и вызываел getNextRecordSet, и когда возвращаемый RecordSet = nil - то все прошли все RecordSet-ы



Lusha   (2002-04-02 18:01) [8]

>DmitryV
ОК. Я вечером дома посмотрю, что возвращает sp_helplogins...

А Вам рекоммендую

Query.SQL.Text := "sp_helplogins";
Query.Open;
Query.FetchAll;

Query.RecordCount // Количество возвращеных записей



Aleksandr   (2002-04-02 18:02) [9]

В Делфи только неявными обращениями работать с ними... То есть не создавать в компоненте зашитых полей, а работать по принципу

if FindField(Name1) then...

Или сделать в процедуре выходной параметр, который и будет возвращать количество наборов данных... Если речь идет о количестве наборов данных...



sniknik   (2002-04-02 18:05) [10]

to Mike_Goblin ©
getNextRecordSet это к чему относится? поясни пожалуйста. и одари кусочком кода pls.



DmitryV   (2002-04-02 18:09) [11]

>Mike_Goblin ©
Thanks, у меня была подобная мысль, но хотелось уточнить :-))
Кстати, при таком подходе не возникает коллизий, когда один из рекордсетов пустой? Иными словами, пустой рекордсет возвращается не как nil?

>sniknik ©
:-) Вопросов я и правда мало задаю, так что практики не хвататет...

>Lusha © (02.04.02 18:01)
Подобный код, если я не ошибаюсь, будет работать только с первым рекордсетом.

С уважением



sniknik   (2002-04-02 18:10) [12]

наверное имеется в виду NextRecordset но все одно как с ним работать?



DmitryV   (2002-04-02 18:13) [13]

>sniknik © (02.04.02 18:10)
Примерно так:
...
ADODataSet1.RecordSet:=ADOQuery1.NextRecordSet(n);
...
Что потом делать с ADODataSet"ом - тебе виднее :-)

С уважением



Delirium   (2002-04-02 19:26) [14]

Действительно провайдер MSSQL поддерживает multiple recordsets - т.е. в результате выполнения одного блока SQL инструкций можно получить множество наборов данных. Найти их количество к сожалению можно только экспериментально - в процессе получения:

procedure TForm1.Button1Click(Sender: TObject);
var R:_RecordSet;
i:integer;
begin
R:=ADOQuery1.Recordset; // первый из набора
while true do
begin
R:=ADOQuery1.NextRecordset(i); // остальные
if R=nil then break;
ShowMessage(IntToStr(i)); // RecordCount
end;
end;



Delirium   (2002-04-02 19:37) [15]

> sniknik
пустой рекордсет возвращается не как nil Если RecordSet<>nil, то возможно что его _RecorSet.State=adStateClosed (ADOInt.pas) это надо учитывать при работе с хранимыми процедурами



Lusha   (2002-04-03 09:05) [16]

>DmitryV ©
Не ошибаетесь. Я познакомился с sp_helplogins и в очередной раз убедился, что ребята Billy могут опошлить любую замечательную идею. Средств для работы с этой хренью у BDE я не нашел... :(

Видимо кесарю кесарево и работать с этой хренью можно только при помощи другой (то бишь ADO)...

Кстати, а если не секрет для чего Вы используете сию процедуру. В свое время писал программу по администрированию и для MS SQL. И необходимости в этой процедурке не было... как то без нее обошелся... :)



SergSuper   (2002-04-03 10:43) [17]

2 DmitryV
Скорее всего такого понятия как "количество возвращаемых рекордсетов" нет и поэтому узнать его невозможно. Если данные рекордсета приходят сразу (т.е. последовательно все записи без перерыва), то сами рекордсеты могут приходить время от времени по ходу выполнения запроса. Например так работают процедуры для Profiler-а: при наступлении какого-либо события они кидают рекордсет с какой-то строкой(тект запроса например), а клиентская программа постоянно ждет рекордсеты.



DmitryV   (2002-04-03 11:18) [18]

>Delirium ©
Спасибо, учтем :-)

>Lusha ©
Эту процедуру я привел только, как пример... Хотя тоже занимаюсь программкой по администрированию :-))

>All
Спасибо за отклики




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




Наверх





Память: 0.75 MB
Время: 0.021 c
14-70004          Polevi                2002-03-13 18:06  2002.04.22  
анекдот


4-70069           ATLANTIDO             2002-02-14 18:01  2002.04.22  
Верхнее окно


14-69980          Sergey13              2002-03-14 11:21  2002.04.22  
А где моя ветка про религию?


3-69668           Michael_Fehler        2002-04-03 12:20  2002.04.22  
ADOQuery


1-69816           mio                   2002-04-08 18:04  2002.04.22  
Непонятности с памятью