从查询中获取结果

Get the result from the Query

我写这段代码:

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' parameter not found

如何使用参数从查询中获取结果?

如果我不能,有什么作用:

无需手动创建参数。数据访问组件足够智能,可以解析 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;

试试这个代码:

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 "knows" 它无能为力。

然后,将 Q.Open 替换为 Q.ExecSQL。当执行时你得到一个异常 随着消息

Cannot execute command returning result set. Hint: Use Open method for SELECT-like commands.

那是你的问题。如果你使用 SELECT 语句,你得到的结果集是否 不管你喜欢与否,访问其内容的方法是做类似

的事情
Nom := Q.FieldByName('Nom').AsString

您在评论中询问了 ptOutput 参数的意义所在。假设你的数据库有一个这样定义的存储过程

Create Procedure spReturnValue(@Value varchar(80) out) as select @Value = 'something'

然后,在您的代码中您可以这样做

  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 的值参数中。