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

Вниз

Передача из хранимой процедуры cursor параметра или DataSet   Найти похожие ветки 

 
isasa ©   (2006-09-11 14:01) [0]

Делал ли кто-нибудь сабж?
Имеем процедуру, из которой надо передать курсор или датасет.
CREATE procedure p_Submission
 @OpCode int = 0,
 @Fill_cursor CURSOR VARYING OUTPUT
AS
SET NOCOUNT ON
BEGIN
 SET @Fill_cursor = CURSOR SCROLL FOR
   SELECT ...
   ...
 OPEN @Fill_cursor;
END

На стороне приложения TADOStoredProc.
Parameters.ParamByName("@Fill_cursor").DataType:=ftCursor;
выдает конфликт с остальными параметрами.


 
evvcom ©   (2006-09-11 14:05) [1]

Делай в ХП просто select и будет тебе неявный курсор. С АДО, правда, не пробовал, но с БДЕ было имеено так. И никаких явных привязок параметров, Open и все ок.


 
Ega23 ©   (2006-09-11 14:06) [2]

Зачем так?
1. Можно воспользоваться временными таблицами.
2. Можно возвращать НД на клиент.
3. Можно из ХП вызывать другую ХП.
Вариантов - масса.
Опиши задачу подробнее, наверняка есть приемлимое решение.


 
isasa ©   (2006-09-11 14:19) [3]

Очень смущает фраза

SQL Server 2005 Books Online
....
Note:  
The cursor data type cannot be bound to application variables through the database APIs such as OLE DB, ODBC, ADO, and DB-Library. Because OUTPUT parameters must be bound before an application can execute a stored procedure, stored procedures with cursor OUTPUT parameters cannot be called from the database APIs. These procedures can be called from Transact-SQL batches, stored procedures, or triggers only when the cursor OUTPUT variable is assigned to a Transact-SQL local cursor variable.
...

поэтому, интересует, передавал ли кто нибудь курсор из хранимой процедуры.
Задача, вкратце такова. Сформировать хранимой DataSet и "впихнуть" его в ADODataSet. Использование .Locate (т.е Read Only устроит, вполне)


 
isasa ©   (2006-09-11 14:20) [4]

Да, временная таблица, очень не желательно, почти исключено. Поэтому и спрашиваю.


 
evvcom ©   (2006-09-11 14:24) [5]

> [3] isasa ©   (11.09.06 14:19)
> передавал ли кто нибудь курсор из хранимой процедуры

Ты [1] уже попробовал? Каковы результаты?


 
Ega23 ©   (2006-09-11 14:30) [6]


> Сформировать хранимой DataSet и "впихнуть" его в ADODataSet.
>  


Create procedure MyProc
@ObjID int null,
@Param1 int null,
 ......
As
Select * from Table1 where
 ((@ObjId is null) or ObjID=@ObjID) and ((@Param1 is null) or Column1=@Param1) and   .......
Go


?

With TADODataSet.Create(nil) do
begin
  try
    Connection:= ....
    CommandText:="exec MyProc";
    try
     Open;
      While not Eof do
        begin
          ......
         Next;
        end;
    except on E:Exception do
      ShowMessage(E.Message) ;
  finally
    Free;
  end;
end;


 
isasa ©   (2006-09-11 14:44) [7]

Ega23 ©   (11.09.06 14:30) [6]
Спасибо. Это работает.
Действительно, надо быть проще, и меньше читать books online.

С курсором происходит следующее.
Параметры процедеры(TADOStoredProc) определяются(количество, имена), за исключением @Fill_cursor, устанавливается в DataType:=ftIntegerp, Direction:=dInputOutput.
При попытке изменить на DataType:=ftCursor(ftDataSet), Direction:=pdOutput - ошибка

Arguments are of the wrong type? are out of acceptable range? or are in conflict with one another.

В хелпе о взаимоисключениях ни черта нет. Метод тыка не помогает.


 
Ega23 ©   (2006-09-11 14:54) [8]


> С курсором происходит следующее.


Я бы порекомендовал не использовать TADOStoredProc и действительно "быть проще".


 
MsGuns ©   (2006-09-11 15:04) [9]

with ADOCommand1 do
 begin
  CommandText := "Exec <ProcedureName>";
  Refdresh;  // Извлечь параметры
  Parameters(ParamByName()).. := ...
  ...
 end;

ADODataSet1.RecordSet := ADOCommand1.Execute;
with ADODataSet1 do
 while Not eof
   begin
    ...
   end;

(Джидаи еще всключают все обращения к серверу  в защищенные  блоки).

И все...


 
isasa ©   (2006-09-11 15:11) [10]

:)
А зачем  TADOCommand? Первый вариант проще.


 
Ega23 ©   (2006-09-11 15:47) [11]


> А зачем  TADOCommand? Первый вариант проще.


От задачи зависит.
В TCustomADODataSet реализована вся начинка борландовского TDataSet. Т.е. всё то, что обычно используется при работе с DS: Next, First, FieldByName, DisableControls-EnableControls, Locate, GetBookMark-GotoBookmark и т.д.
А TADOCommand лишён всего этого. можно, например, всю работу с БД через ADOCommand строить, а наборы данных через него получать и "загонять" уже в ADODataSet - иногда полезно.
В общем, оба варианта имеют право на существования, всё на усмотрение разработчика.



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

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.057 c
2-1161163863
pkm
2006-10-18 13:31
2006.11.05
Мемо.


2-1161607652
atruhin
2006-10-23 16:47
2006.11.05
Сравнение событий Onxxxx


2-1161152032
Tatushka
2006-10-18 10:13
2006.11.05
Свойство ButtonStyle компонента DBGrid


15-1160844416
Kolan
2006-10-14 20:46
2006.11.05
Использование объектов для простых типов. Стоит ли?


15-1161159145
DevilDevil
2006-10-18 12:12
2006.11.05
Файл Ресурсов VS C++