Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从查询中获取结果_Delphi_Delphi 10 Seattle_Firedac - Fatal编程技术网

Delphi 从查询中获取结果

Delphi 从查询中获取结果,delphi,delphi-10-seattle,firedac,Delphi,Delphi 10 Seattle,Firedac,我写这段代码: 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

我写这段代码:

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”参数

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

如果我不能,以下功能是什么:

  • 输出

  • ptResult


    • 无需手动创建参数。数据访问组件足够智能,可以解析SQL字符串并自行填充参数集合

      要获得结果,还必须读取查询的字段。在查询组件上调用
      Open
      时,字段集合将填充您在
      SELECT[fields]
      SQL语句中指定的字段

      作为旁注,我建议您使用类型安全版本从
      t字段
      t参数
      对象获取值:


      无需手动创建参数。数据访问组件足够智能,可以解析SQL字符串并自行填充参数集合

      要获得结果,还必须读取查询的字段。在查询组件上调用
      Open
      时,字段集合将填充您在
      SELECT[fields]
      SQL语句中指定的字段

      作为旁注,我建议您使用类型安全版本从
      t字段
      t参数
      对象获取值:

      请尝试以下代码:

      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.Open
      替换为
      Q.ExecSQL
      。当它执行时,您会得到一个异常 带着信息

      无法执行返回结果集的命令。 提示:对类似SELECT的命令使用Open方法

      这就是你的问题。如果使用SELECT语句,则会得到一个结果集 不管您喜欢与否,访问其内容的方法是执行以下操作

      Nom := Q.FieldByName('Nom').AsString
      
      您在评论中询问了
      ptOutput
      参数的意义。假设您的数据库有一个这样定义的存储过程

      创建过程spReturnValue(@Value varchar(80)out) 作为 选择@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的值参数中。

      请尝试以下代码:

      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.Open
      替换为
      Q.ExecSQL
      。当它执行时,您会得到一个异常 带着信息

      无法执行返回结果集的命令。 提示:对类似SELECT的命令使用Open方法

      这就是你的问题。如果使用SELECT语句,则会得到一个结果集 不管您喜欢与否,访问其内容的方法是执行以下操作

      Nom := Q.FieldByName('Nom').AsString
      
      您在评论中询问了
      ptOutput
      参数的意义。假设您的数据库有一个这样定义的存储过程

      创建过程spReturnValue(@Value varchar(80)out) 作为 选择@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的Value参数中。

      您犯的错误是假设查询返回单个值。否则,它将返回一个结果集。此外,尽管您的数据可能不是这样,但可能有多个数据行与您的搜索条件匹配。@MartynA感谢您的评论,查询返回一行,我知道我可以从
      字段中获得结果,但是我只想在
      输出参数中返回雇主的名称。您犯的错误是假设查询返回单个值。否则,它将返回一个结果集。此外,尽管您的数据可能不是这样,但可能有多个数据行与您的搜索条件匹配。@MartynA感谢您的评论,查询返回一行,我知道我可以从
      字段中获得结果,但是我只想在输出参数中返回雇主的名字。谢谢你的回答,但是在我的问题中我用参数说,我知道如何从
      字段中获取数据,我想用
      ptOutput
      参数,如果我不知道这类
      参数
      @Sami的用途是什么,那么在您的示例中没有输出参数,因此您不能使用
      ptOutput
      。您正在选择一个表字段,因此必须使用
      字段
      属性。输出参数仅与实际定义输出参数的存储过程一起使用。只有这样,你才能使用
      ptOutput
      @RemyLebeau谢谢:)谢谢你的回答,但在我的Q中,我用
      参数说,我知道如何从
      字段中获取数据,我想用
      ptOutput
      参数,如果我不知道这类
      参数
      @Sami的用途是什么,那么在您的示例中没有输出参数,因此您不能使用
      ptOutput
      。您正在选择一个表字段,因此必须使用
      字段
      属性。输出参数仅与实际定义输出参数的存储过程一起使用。只有这样,您才能使用
      ptOutput
      @RemyLebeau谢谢:)