2017-01-24 22 views
2

я создал следующие хранимые процедуры на MS SQL ServerFireDAC - Как выполнить хранимую процедуру с параметрами по умолчанию?

CREATE PROCEDURE sppl_ParamTest 
@ID int = 666 
AS 
BEGIN 
    SELECT @ID; 
END 

И пытается вызвать его с FireDAC (без создания каких-либо параметров):

FCommand:TFDCommand; 
... 
FCommand.Params.Clear; 
FCommand.SQL.Text:='sppl_ParamTest'; 
FCommand.CommandKind:=skStoredProc 
if FCommand.Params.Count=0 then 
FCommand.Open; 

Но хранимая процедура возвращает NULL (supose вернуть 666)

Как я понял, это вызвано магической силой FireDAC для запроса каждой метаданных процедуры, прежде чем процедура фактически вызовет.

Можно ли это решить?

+0

Вы можете указать параметры, если включить мета флаг в FetchOptions, это описано в [руководстве] (http://docwiki.embarcadero.com/RADStudio/en/Executing_Stored_Procedures_ (FireDAC)) – whosrdaddy

+0

Большое спасибо, это сработало –

ответ

4

Я добавил ваше определение sppl_ParamTest к моему серверу Sql 2014 и выполнил следующий код после минимальной конфигурации FDConnection, чтобы указать его на серверную базу данных &. FDQuery является свежим из палитры компонентов с установленным только свойством Connection.

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FDQuery1.SQL.Text := 'sppl_ParamTest'; 
    FDQuery1.Open; 
    Caption := FDQuery1.Fields[0].AsString; 
end; 

Подпись формы отображает 666, как ожидалось.

Частичное DFM (имя пользователя и пароль опущена):

object FDConnection1: TFDConnection 
    Params.Strings = (
     'Database=MATest' 
     'Server=MAT410\ss2014' 
     'DriverID=MSSQL') 
    LoginPrompt = False 
    Left = 32 
    Top = 16 
    end 
    object FDQuery1: TFDQuery 
    Connection = FDConnection1 
    Left = 104 
    Top = 16 
    end 

Update Я думаю, что проблема в OP является, скорее всего, возникающий из-за ошибки в реализации TFDCommand и TFDStoredProc. Выполнение

sppl_ParamTest по умолчанию

в Sql Server Management Studio корректно возвращает

Так же открытие FDQuery с sppl_ParamTest default (или просто sppl_ParamTest) в качестве своей команды текст.

Однако с CommandText TFDCommand Установим на ту же величину, вызывая Execute на него производит эту ошибку

не удалось найти хранимую 'MATest.dbo.sspl_ParamTest по умолчанию' Порядок действий

В равной степени, делать

FDStoredProc1.ParamByName('@ID').Value := 'default'; 

(Unsurprisingly) вызывает ошибку

Не удалось преобразовать вариант типа (String) в тип (Integer)

по призванию FDStoredProc.Open и до сих пор сопротивлялся моим попыткам установить тип параметра, который будет принимать «по умолчанию» и правильного выполнения зр.

Кроме того, попытки вызвать FDCommand с EmptyParam в качестве значения входного параметра не могут вернуть значение 666.

+0

Вы используете запрос для выполнения хранимой процедуры. Не FDCommand. FDCommand используется для заполнения набора данных In-Mem. –

+0

Ваш вопрос: «Можно ли это решить?» Мой ответ: «Да, используйте FDQuery, и проблема не возникает в первую очередь». – MartynA

+0

Я не могу использовать запросы для заполнения в наборах данных памяти. Ваше решение аналогично заменяет текст на «exec sspl_paramtest» –

2

Установка этой опции в

FetchOptions.Items:=[] 

или

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

помешает FireDac из запросов мета данных, а также позволит использовать PARAM по умолчанию.

Благодаря whosrdaddy

+0

Не могли бы вы объяснить: какой компонент, FDCommand или FDStoreProc вы используете, который решает вашу проблему, как вы получаете ее, чтобы «использовать параметры по умолчанию» и как вы получаете доступ к результатам вызова, чтобы получить значение 666? –

+0

Вы можете использовать любые FDCommand или FDStoredProc. FDStoredProc.ProceudreName: = 'sppl_ParamTest'; FDStoredProc.FetchOptions.Items: = []; FDStoredProc.Open; ShowMessage (FDStoredProc.Fields [0].AsString); // 666 –

+0

А, ладно, спасибо. –

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