2017-03-30 4 views
0

Ich schreibe diesen Code:Holen Sie sich das Ergebnis aus der Abfrage

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)); 

Das Ergebnis sollte der Name des Arbeitgebers sein.

Ich erhalte eine Fehlermeldung:

'N' Parameter nicht

gefunden Wie kann ich das Ergebnis der Abfrage mit dem Parameter bekommen?

Wenn ich kann nicht, was das ist die Funktion:

  • ptOutput

  • ptResult

+0

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

+0

@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

Antwort

3

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.

3

Es gibt keine Notwendigkeit, Parameter manuell erstellen ist. Datenzugriffskomponenten sind intelligent genug, um die SQL-Zeichenfolge zu analysieren und die Parametersammlung selbst zu füllen.

Um auch das Ergebnis zu erhalten, müssen Sie die Felder der Abfrage lesen. Wenn Sie Open für eine Query-Komponente aufrufen, wird die Feldauflistung mit den Feldern gefüllt, die Sie in der SELECT [fields] SQL-Anweisung angegeben haben. Als Randnotiz rate ich, dass Sie die typsichere Version verwenden, um den Wert abzurufen ein TField oder TParameter Objekt: 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; 
+0

Danke für die Antwort, aber in meinem Q sagte ich mit 'Parameter', ich weiß, wie man die Daten aus dem 'Feld', ich will das mit' ptOutput' Parameter, und wenn ich nicht was kann der Zweck dieser Art von 'Parameters'. – Sami

+1

@Sami In Ihrem Beispiel gibt es keinen Ausgabeparameter, Sie können also 'ptOutput' nicht verwenden. Sie wählen ein Tabellenfeld aus, Sie müssen also die Eigenschaft 'Felder' verwenden. Ein Ausgabeparameter wird nur mit einer gespeicherten Prozedur verwendet, die tatsächlich einen Ausgabeparameter definiert. Nur dann können Sie 'ptOutput' verwenden. –

+0

@RemyLebeau Danke :) – Sami

Verwandte Themen