試試這個代碼:
procedure TForm1.ExecuteQuery;
var
SQL : String;
Q : TFDQuery;
begin
SQL := 'select ''Sami'' as NOM'; // Tested with MS Sql Server backend
try
Q := TFDQuery.Create(Self);
Q.Connection := FDConnection1;
Q.Params.CreateParam(ftString, 'Nom', ptOutput);// Try also ptResult
Q.SQL.Text := SQL;
Q.Open;
ShowMessage(IntToStr(Q.ParamCount));
Caption := Q.FieldByName('Nom').AsString;
finally
Q.Free; // otherwise you have a memory leak
end;
end;
你會看到,創建參數已不存在一旦FDQuery被打開,因爲FireDAC「知道」它沒有什麼可以處理它。
然後,用Q.ExecSQL
代替Q.Open
。執行該操作時,您會收到一個異常 ,並顯示消息
無法執行返回結果集的命令。提示:對類似SELECT的命令使用Open方法。
這就是你的問題。如果您使用SELECT語句,你會得到一個結果集是否 喜歡還是不喜歡,並訪問其內容的辦法就是像做
Nom := Q.FieldByName('Nom').AsString
你問的評論是什麼ptOutput
點參數。假設您的數據庫有一個像定義的存儲過程,這
創建過程spReturnValue(@Value VARCHAR(80)出) 作爲 選擇@Value = '東西'
然後,在你的代碼可以做
SQL := 'exec spReturnValue :Value'; // note the absence of the `out` qualifier in the invocation of the SP
try
Q := TFDQuery.Create(Self);
Q.Connection := FDConnection1;
Q.Params.CreateParam(ftString, 'Value', ptOutput);// Try also ptResult
Q.SQL.Text := SQL;
Q.ExecSQL;
ShowMessage(IntToStr(Q.ParamCount));
Caption := Q.ParamByName('Value').AsString;
finally
Q.Free; // otherwise you have a memory leak
end;
它將存儲過程的輸出參數檢索到Q的Value參數中。
您所犯的錯誤是假設查詢返回單個值。它不,它返回一個結果集。另外,儘管數據可能不是這種情況,但可能有多個數據行與您的搜索條件相匹配。 – MartynA
@MartynA感謝你的評論,查詢返回一行,我知道我可以從Field中得到結果,但是我想在'Output Paramater'中只返回僱主的名字。 – Sami