2016-01-07 2 views
2

Я это хранимая процедура определена в Firebird Database:Получить выходной параметр из FireDac хранимой процедуры

create or alter procedure GET_MSG (
    IDLNG smallint, 
    IDMSG integer) 
returns (
    MSG varchar(200) character set UTF8) 
as 
begin 
IF (:IDMSG > 40000) THEN 
    BEGIN 
    IF (:IDLNG = 1) THEN 
    BEGIN 
    SELECT NOMBRE01 FROM XMSG2 WHERE ID_XMSG2 = :IDMSG INTO :MSG; 
    EXIT; 
    END 
    IF (:IDLNG = 2) THEN 
    BEGIN 
    SELECT NOMBRE02 FROM XMSG2 WHERE ID_XMSG2 = :IDMSG INTO :MSG; 
    EXIT; 
    END 
    END ELSE 
    BEGIN 
    IF (:IDLNG = 1) THEN 
    BEGIN 
    SELECT NOMBRE01 FROM XMSG WHERE ID_XMSG = :IDMSG INTO :MSG; 
    EXIT; 
    END 
    IF (:IDLNG = 2) THEN 
    BEGIN 
    SELECT NOMBRE02 FROM XMSG WHERE ID_XMSG = :IDMSG INTO :MSG; 
    EXIT; 
    END 
    END 
end 

и я использую этот код для вызова этой хранимой процедуры из Firedac:

SPGeneric.StoredProcName:= 'GET_MSG'; 
SPGeneric.FetchOptions.Items:= SPGeneric.FetchOptions.Items - [fiMeta]; 
SPGeneric.Prepare; 
with SPGeneric.Params do begin 
    Clear; 
    with Add do begin 
    Name:= 'IDLNG'; 
    ParamType:= ptInput; 
    DataType:= ftSmallint; 
    Value:= IdLan; 
    end; 
    with Add do begin 
    Name:= 'IDMSG'; 
    ParamType:= ptInput; 
    DataType:= ftInteger; 
    Value:= Id; 
    end; 
    with Add do begin 
    Name:= 'MSG'; 
    ParamType:= ptOutput; 
    DataType:= ftString; 
    Size:= 200; 
    end; 
end; 
SPGeneric.ExecProc; 
result:= VarToStr(SPGeneric.Params[2].Value); 

проблема в том, что когда я вызываю этот код с правильными параметрами (отмеченными внутри Firebird), результат всегда равен нулю. Что-то не так с этим кодом? Благодаря

Это код, который работает нормально:

SPGeneric.StoredProcName:= 'GET_MSG'; 
SPGeneric.FetchOptions.Items:= SPGeneric.FetchOptions.Items - [fiMeta]; 
SPGeneric.Params.Clear; 
    with SPGeneric.Params.Add do begin 
    Name:= 'IDLNG'; 
    ParamType:= ptInput; 
    DataType:= ftSmallint; 
    end; 
    with SPGeneric.Params.Add do begin 
    Name:= 'IDMSG'; 
    ParamType:= ptInput; 
    DataType:= ftInteger; 
    end; 
    with SPGeneric.Params.Add do begin 
    Name:= 'MSG'; 
    ParamType:= ptOutput; 
    DataType:= ftWideString; 
    Size:= 200; 
    end; 

SPGeneric.Prepare; 
SPGeneric.Params[0].Value:= IdLan; 
SPGeneric.Params[1].Value:= Id; 
SPGeneric.ExecProc; 
result:= VarToStr(SPGeneric.Params[2].Value); 
  • вызов Приготовьте после заполнения параметров.
  • присвоить значения параметров после подготовки вызова.

ответ

2

От documentation:

После Приготовьте называется, приложение не может изменить типы и размеры данных параметров команды. В противном случае во время следующего вызова Execute/ExecSQL/ExecProc/Open будет создано исключение. Рекомендуется настроить параметры перед вызовом Prepare.

Здесь Вы выбрали не заполняются автоматически информации о параметрах с

SPGeneric.FetchOptions.Items:= SPGeneric.FetchOptions.Items - [fiMeta]; 

Итак, поскольку вы вручную определить параметры, вы должны сделать это до того вызова Prepare.

Смежные вопросы