diesen Code Versuchen:
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;
Sie werden sehen, dass die erstellten Parameter nicht mehr existiert Sobald die FDQuery geöffnet ist, weil FireDAC "weiß", dass nichts damit zu tun hat.
Dann ersetzen Sie Q.Open
durch Q.ExecSQL
. Wenn das ausgeführt wird, erhalten Sie eine Ausnahme mit der Nachricht
Kann Befehl nicht ausführen, Ergebnismenge zurückgeben. Hinweis: Verwenden Sie die Open-Methode für SELECT-ähnliche Befehle.
Und das ist dein Problem. Wenn Sie eine SELECT-Anweisung verwenden, erhalten Sie ein Ergebnis festlegen, ob Sie es mögen oder nicht, und die Art und Weise seinen Inhalt zuzugreifen ist, etwas zu tun wie
Nom := Q.FieldByName('Nom').AsString
Sie in einem Kommentar gefragt, was der Punkt von ptOutput
ist Parameter.Angenommen, Ihre Datenbank eine gespeicherte Prozedur definiert wie folgt
Create Procedure spReturnValue (@Value varchar (80) aus) als wählen @Value = 'etwas'
Dann Sie in Ihrem Code könnte
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;
, die den Ausgabeparameter des Stored Proc in Qs Value-Parameter ruft.
Der Fehler, den Sie machen, ist anzunehmen, dass die Abfrage einen einzelnen Wert zurückgibt. Es gibt keine Ergebnismenge. Auch wenn dies bei Ihren Daten möglicherweise nicht der Fall ist, kann es mehr als eine Datenzeile geben, die Ihrem Suchkriterium entspricht. – MartynA
@MartynA danke für den Kommentar, die Abfrage eine Zeile zurück, ich weiß, dass ich das Ergebnis aus dem 'Field' erhalten kann, aber ich möchte nur den Namen des Arbeitgebers in der 'Output Paramater' zurückgeben. – Sami