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

Вниз

Передача из хранимой процедуры 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
4-1150724006
novill
2006-06-19 17:33
2006.11.05
Заняты ли "горячие клавиши"? Или получить список активных?


2-1161456604
simona4
2006-10-21 22:50
2006.11.05
база глючит на других компах


2-1161541388
Officeman
2006-10-22 22:23
2006.11.05
ST := StringReplace(TOVAR, &amp;amp; , &amp; , [frReplaceAll]); ???


2-1161188335
fog
2006-10-18 20:18
2006.11.05
Печать графики


15-1161259468
vidiv
2006-10-19 16:04
2006.11.05
Помогите скачать МаилРу агента...





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