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谢谢:)