Форум: "Базы";
Текущий архив: 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