![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача из хранимой процедуры cursor параметра или DataSet [D6, MSSQL]
isasa © (2006-09-11 14:01:00)Делал ли кто-нибудь сабж?
Имеем процедуру, из которой надо передать курсор или датасет.
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;
выдает конфликт с остальными параметрами.
Ega23 (2006-09-11 15:47:00) [1]
> А зачем TADOCommand? Первый вариант проще.
От задачи зависит.
В TCustomADODataSet реализована вся начинка борландовского TDataSet. Т.е. всё то, что обычно используется при работе с DS: Next, First, FieldByName, DisableControls-EnableControls, Locate, GetBookMark-GotoBookmark и т.д.
А TADOCommand лишён всего этого. можно, например, всю работу с БД через ADOCommand строить, а наборы данных через него получать и "загонять" уже в ADODataSet - иногда полезно.
В общем, оба варианта имеют право на существования, всё на усмотрение разработчика.
isasa (2006-09-11 15:11:00) [2]:)
А зачем TADOCommand? Первый вариант проще.
MsGuns (2006-09-11 15:04:00) [3]with ADOCommand1 do
begin
CommandText := 'Exec <ProcedureName>';
Refdresh; // Извлечь параметры
Parameters(ParamByName()).. := ...
...
end;
ADODataSet1.RecordSet := ADOCommand1.Execute;
with ADODataSet1 do
while Not eof
begin
...
end;
(Джидаи еще всключают все обращения к серверу в защищенные блоки).
И все...
Ega23 (2006-09-11 14:54:00) [4]
> С курсором происходит следующее.
Я бы порекомендовал не использовать TADOStoredProc и действительно "быть проще".
isasa (2006-09-11 14:44:00) [5]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:30:00) [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;
evvcom (2006-09-11 14:24:00) [7]> [3] isasa © (11.09.06 14:19)
> передавал ли кто нибудь курсор из хранимой процедуры
Ты [1] уже попробовал? Каковы результаты?
isasa (2006-09-11 14:20:00) [8]Да, временная таблица, очень не желательно, почти исключено. Поэтому и спрашиваю.
isasa (2006-09-11 14:19:00) [9]Очень смущает фраза
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 устроит, вполне)
Ega23 (2006-09-11 14:06:00) [10]Зачем так?
1. Можно воспользоваться временными таблицами.
2. Можно возвращать НД на клиент.
3. Можно из ХП вызывать другую ХП.
Вариантов - масса.
Опиши задачу подробнее, наверняка есть приемлимое решение.
evvcom (2006-09-11 14:05:00) [11]Делай в ХП просто select и будет тебе неявный курсор. С АДО, правда, не пробовал, но с БДЕ было имеено так. И никаких явных привязок параметров, Open и все ок.