Главная страница
    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.48 MB
Время: 0.052 c
2-1161292434
fog
2006-10-20 01:13
2006.11.05
Глюк !!!


2-1161250863
Axis_of_Evil
2006-10-19 13:41
2006.11.05
работа с XML документом


2-1161324932
Steep
2006-10-20 10:15
2006.11.05
Строки и потоки


15-1160522565
Германн
2006-10-11 03:22
2006.11.05
Пусть на меня посыпятся ещё куча кирпичей,


6-1150292201
Интересующийся
2006-06-14 17:36
2006.11.05
Список всех машин в диапозоне между двумя IP





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