从查询中获取结果
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
如何使用参数从查询中获取结果?
如果我不能,有什么作用:
ptOutput
ptResult
无需手动创建参数。数据访问组件足够智能,可以解析 SQL 字符串并自行填充参数集合
另外,要获得结果,您必须阅读查询的字段。当您在查询组件上调用 Open
时,字段集合将填充您在 SELECT [fields]
SQL 语句
中指定的字段
附带说明一下,我建议您使用类型安全版本从 TField
或 TParameter
对象获取值: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 的值参数中。
我写这段代码:
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
如何使用参数从查询中获取结果?
如果我不能,有什么作用:
ptOutput
ptResult
无需手动创建参数。数据访问组件足够智能,可以解析 SQL 字符串并自行填充参数集合
另外,要获得结果,您必须阅读查询的字段。当您在查询组件上调用 Open
时,字段集合将填充您在 SELECT [fields]
SQL 语句
附带说明一下,我建议您使用类型安全版本从 TField
或 TParameter
对象获取值: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 的值参数中。