Конференция "Базы" » Не могу отправить параметр из внешней хранимой процедуры. [D7, MSSQL]
 
  • Still Swamp (16.06.08 15:21) [0]
    На сервере 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 я делаю.
  • clickmaker © (16.06.08 15:28) [1]
    а как сама srv_paramsetoutput выглядит?
  • Still Swamp (16.06.08 15:30) [2]
    Ээээ... это экспортируемая функция из Opends60.dll.
  • clickmaker © (16.06.08 15:36) [3]
    > [2] Still Swamp   (16.06.08 15:30)

    а при выполнении хранимки, скажем, из сиквельной студии, результат возвращается?
  • Still Swamp (16.06.08 15:39) [4]
    Собстно говоря в студии и проверяем. Нет. Не возвращается. Возвращается изначальное значение, те сам параметр не меняется в случае если он описан как TEXT. Условие аутпутности срабатывает нормально.
  • clickmaker © (16.06.08 15:53) [5]
    > [4] Still Swamp   (16.06.08 15:39)

    тогда текст хранимки - в студию
  • Still Swamp (16.06.08 16:01) [6]
    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
  • Ega23 © (16.06.08 16:08) [7]
    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

  • Still Swamp (16.06.08 16:13) [8]
    Имеется в виду, вместо
    @LineMenu text = NULL,
    написать
    @LineMenu text = NULL output,
    ?

    Hе катит... это же описание параметров как аутпутных для вызывающей процедуры. В данном случае это не имеет никакого значения.
  • Ega23 © (16.06.08 16:27) [9]
    А, виноват, неправильно тебя понял.
  • Still Swamp (16.06.08 16:31) [10]
    Блин - с этим TEXT - какая то постоянная борода.
  • clickmaker © (16.06.08 16:39) [11]
    > master.dbo.XP_StrTran

    а у нее какого типа параметр?
  • Ega23 © (16.06.08 16:41) [12]

    > Блин - с этим TEXT - какая то постоянная борода.


    БЛОБы - они такие, ага...
  • Still Swamp (16.06.08 16:58) [13]
    Хм... не понял вопроса.
    У самой процедуры в DLL какие типы параметров? Никакие. Я там работаю с указателем и размером данных. Типизацию не использую. Хотя и проверяю для контроля.
  • clickmaker © (16.06.08 17:34) [14]
    > @LineMenu OUT

    вот это какого типа?
  • Still Swamp (16.06.08 18:35) [15]
    в описании sp - text
    в процедуре - никакого. я принимаю параметр - копирую блок памяти, и возвращаю его.
  • clickmaker © (16.06.08 18:49) [16]
    вот так что возвращает?

    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 ?
  • Igor (17.06.08 10:48) [17]

    > declare @LineMenu text

    Работать не будет.
    Вызывет ошибку:
    "Для локальных переменных недопустимы типы данных text, ntext и image."
 
Конференция "Базы" » Не могу отправить параметр из внешней хранимой процедуры. [D7, MSSQL]
Есть новые Нет новых   [134434   +28][b:0][p:0.001]