Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу отправить параметр из внешней хранимой процедуры. [D7, MSSQL]


Still Swamp ©   (2008-06-16 15:21:00) 

На сервере 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 я делаю.


Igor   (2008-06-17 10:48:00) [1]


> declare @LineMenu text

Работать не будет.
Вызывет ошибку:
"Для локальных переменных недопустимы типы данных text, ntext и image."


clickmaker   (2008-06-16 18:49:00) [2]

вот так что возвращает?

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 ?


Still Swamp   (2008-06-16 18:35:00) [3]

в описании sp - text
в процедуре - никакого. я принимаю параметр - копирую блок памяти, и возвращаю его.


clickmaker   (2008-06-16 17:34:00) [4]

> @LineMenu OUT

вот это какого типа?


Still Swamp   (2008-06-16 16:58:00) [5]

Хм... не понял вопроса.
У самой процедуры в DLL какие типы параметров? Никакие. Я там работаю с указателем и размером данных. Типизацию не использую. Хотя и проверяю для контроля.


Ega23   (2008-06-16 16:41:00) [6]


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


БЛОБы - они такие, ага...


clickmaker   (2008-06-16 16:39:00) [7]

> master.dbo.XP_StrTran

а у нее какого типа параметр?


Still Swamp   (2008-06-16 16:31:00) [8]

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


Ega23   (2008-06-16 16:27:00) [9]

А, виноват, неправильно тебя понял.


Still Swamp   (2008-06-16 16:13:00) [10]

Имеется в виду, вместо
@LineMenu text = NULL,
написать
@LineMenu text = NULL output,
?

Hе катит... это же описание параметров как аутпутных для вызывающей процедуры. В данном случае это не имеет никакого значения.


Ega23   (2008-06-16 16:08:00) [11]

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   (2008-06-16 16:01:00) [12]

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


clickmaker   (2008-06-16 15:53:00) [13]

> [4] Still Swamp   (16.06.08 15:39)

тогда текст хранимки - в студию


Still Swamp   (2008-06-16 15:39:00) [14]

Собстно говоря в студии и проверяем. Нет. Не возвращается. Возвращается изначальное значение, те сам параметр не меняется в случае если он описан как TEXT. Условие аутпутности срабатывает нормально.


clickmaker   (2008-06-16 15:36:00) [15]

> [2] Still Swamp   (16.06.08 15:30)

а при выполнении хранимки, скажем, из сиквельной студии, результат возвращается?


Still Swamp   (2008-06-16 15:30:00) [16]

Ээээ... это экспортируемая функция из Opends60.dll.


clickmaker   (2008-06-16 15:28:00) [17]

а как сама srv_paramsetoutput выглядит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо