2017-03-30 23 views
0

得到的結果我寫這樣的代碼:從查詢

Var Q : TFDQuery; 
begin 
Q := TFDQuery.Create(Self); 
Q.Connection := FDConnection1; 
Q.Params.CreateParam(ftString,'N',ptOutput);// Try also ptResult 
Q.Params.CreateParam(ftInteger,'ID',ptInput); 
Q.SQL.Text := 'SELECT NOM FROM EMPLOYEE WHERE ID_EMP = :ID'; 
Q.Params.ParamByName('ID').Value := 1; 
Q.Active := True; 
ShowMessage(VarToStr(Q.Params.ParamByName('N').Value)); 

結果應該是僱主的名字。

我得到一個錯誤:

「N」參數未發現

我怎樣才能使用參數從查詢結果?

如果我做不到,有什麼功能:

  • ptOutput

  • ptResult

+0

您所犯的錯誤是假設查詢返回單個值。它不,它返回一個結果集。另外,儘管數據可能不是這種情況,但可能有多個數據行與您的搜索條件相匹配。 – MartynA

+0

@MartynA感謝你的評論,查詢返回一行,我知道我可以從Field中得到結果,但是我想在'Output Paramater'中只返回僱主的名字。 – Sami

回答

3

試試這個代碼:

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參數中。

3

無需手動創建參數。數據訪問組件足夠聰明,可以解析SQL字符串並自行填充參數集合

也要獲取結果,您必須閱讀查詢的字段。當您在查詢組件上調用Open時,字段集合將填充您在SELECT [fields] SQL語句中指定的字段

作爲便箋,我建議您使用類型安全版本以獲取值一個TFieldTParameter對象:See more here

var 
    q : TFDQuery; 
begin 
    q := TFDQuery.Create(Self); 
    q.Connection := FDConnection1; 
    q.SQL.Text := 'SELECT NOM FROM EMPLOYEE WHERE ID_EMP = :ID'; 
    q.ParamByName('ID').AsInteger := 1; 
    q.Open; 
    ShowMessage(q.FieldByName('Nom').AsString); 
end; 
+0

謝謝你的回答,但在我Q中,我用'Parameter'說過,我知道如何從'Field'獲取數據,我想用'ptOutput'參數來做到這一點,如果我不能做什麼這種'Parameters'的目的。 – Sami

+1

@Sami在你的例子中沒有輸出參數,所以你不能使用'ptOutput'。你正在選擇一個表字段,所以你必須使用'Fields'屬性。輸出參數僅用於實際定義輸出參數的存儲過程。只有這樣你才能使用'ptOutput'。 –

+0

@RemyLebeau謝謝:) – Sami