-
На сервере MSSQL2005 есть хранимая процедура. Один из параметров описан как TEXT Output.
Экспортирую функцию для отправки аутпутных параметров: function srv_paramsetoutput(srvproc: Pointer; num: integer; pbData: Pointer; cbLen: integer; fNull: boolean): integer; cdecl; external 'Opends60.dll' name 'srv_paramsetoutput';
Написал функцию оберку свою: procedure SetParamString; var Typ:Integer; MaxLength:Integer; DataSize:Integer; IsNull:boolean; begin srv_paraminfo(ASrvProc, ANum, Typ, MaxLength, DataSize, nil, IsNull); if (srv_paramstatus(ASrvProc, ANum) and 1) = 1 then begin // Проверка, является ли данный параметр аутпутным if MaxLength<=Length(AValue) then AValue:=Copy(AValue, 1, MaxLength); // Обрезь до необходимого размера srv_paramsetoutput(ASrvProc, ANum, PChar(AValue), Length(AValue), False); end; end;
После исполнения на SQL приходит NUL. В том случае, если я описываю параметр как varchar, то все благополучно возвращается. Однако у varchar есть ограничение 8тыс байт.
Что не так с типом TEXT я делаю.
-
а как сама srv_paramsetoutput выглядит?
-
Ээээ... это экспортируемая функция из Opends60.dll.
-
> [2] Still Swamp (16.06.08 15:30)
а при выполнении хранимки, скажем, из сиквельной студии, результат возвращается?
-
Собстно говоря в студии и проверяем. Нет. Не возвращается. Возвращается изначальное значение, те сам параметр не меняется в случае если он описан как TEXT. Условие аутпутности срабатывает нормально.
-
> [4] Still Swamp (16.06.08 15:39)
тогда текст хранимки - в студию
-
ALTER PROCEDURE [dbo].[_MenuLSelectSiteFolder] -- @LineMenu text = NULL, @LineMenu varchar(255) = NULL, @MainFrame varchar(255) = NULL, @MainFrame2 varchar(255) = NULL, @MainFrame3 varchar(255) = NULL
AS
EXEC master.dbo.XP_StrTran '121', '2', '*111*', @LineMenu OUT, @MainFrame OUT, @MainFrame2 OUT, @MainFrame3 OUT
SELECT @MainFrame, @MainFrame2, @LineMenu, @MainFrame3
-
ALTER PROCEDURE [dbo].[_MenuLSelectSiteFolder]
-- @LineMenu text = NULL,
@LineMenu varchar(255) = NULL output,
@MainFrame varchar(255) = NULL output,
@MainFrame2 varchar(255) = NULL output,
@MainFrame3 varchar(255) = NULL output
AS
EXEC master.dbo.XP_StrTran '121', '2', '*111*', @LineMenu OUT, @MainFrame OUT, @MainFrame2 OUT, @MainFrame3 OUT
SELECT @MainFrame, @MainFrame2, @LineMenu, @MainFrame3
-
Имеется в виду, вместо @LineMenu text = NULL, написать @LineMenu text = NULL output, ?
Hе катит... это же описание параметров как аутпутных для вызывающей процедуры. В данном случае это не имеет никакого значения.
-
А, виноват, неправильно тебя понял.
-
Блин - с этим TEXT - какая то постоянная борода.
-
> master.dbo.XP_StrTran
а у нее какого типа параметр?
-
> Блин - с этим TEXT - какая то постоянная борода.
БЛОБы - они такие, ага...
-
Хм... не понял вопроса. У самой процедуры в DLL какие типы параметров? Никакие. Я там работаю с указателем и размером данных. Типизацию не использую. Хотя и проверяю для контроля.
-
> @LineMenu OUT
вот это какого типа?
-
в описании sp - text в процедуре - никакого. я принимаю параметр - копирую блок памяти, и возвращаю его.
-
вот так что возвращает?
declare @LineMenu text
EXEC master.dbo.XP_StrTran '121', '2', '*111*', @LineMenu OUT, @MainFrame OUT, @MainFrame2 OUT, @MainFrame3 OUT
SELECT @MainFrame, @MainFrame2, @LineMenu, @MainFrame3
если я правильно понял, XP_StrTran вызывает процедуру из dll, которая копирует блок памяти в параметр @LineMenu ?
-
> declare @LineMenu text
Работать не будет. Вызывет ошибку: "Для локальных переменных недопустимы типы данных text, ntext и image."
|