2012-03-30 6 views
2

Ich würde gerne wissen, wie kann ich das SQL-Abfrage-Ergebnis in eine Variable setzen.SQL Query Ausgabe auf eine Variable in Delphi?

Ich bin mir bewusst, dieser

integerVariable := UniQuery1.RecordCount; 

aber das?

integerVariable := SELECT COUNT(*) FROM Orders WHERE Amount='1000' 
+3

Ehm, was? Ich denke, du meinst etwas wie 'UniQuery1.Fields [0] .AsInteger', wenn du in der ersten Zeile deines Datasets bist, aber wir wissen nicht einmal, welcher Typ das' UniQuery1' ist. – TLama

+1

@TLama UniQuery1: TUniQuery, er/sie verwendet die UniDAC-Komponenten von http://www.devart.com/unidac/ – ComputerSaysNo

+1

Vergessen Sie nicht, die Antworten zu akzeptieren, die Ihre Fragen lösen ['this way'] (http://meta.stackexchange.com/a/5235/179541). Es wird den zukünftigen Besuchern helfen, die richtige Lösung zu erkennen. Danke und viel Spaß mit StackOverflow! – TLama

Antwort

6

, was Sie brauchen, ist zuerst „Ausführen“ die SQL zu tun, dann für Ergebnis überprüfen, wenn das Ergebnis vorhanden ist, dann speichern Sie es in einer Variablen, hier ist was ich meine:

procedure ...; 
var 
    LCount: Integer; 
begin 
    LCount := 0; 
    // 
    // note that I am doubling the single quote to escape it 
    // 
    // set the query 
    UniQuery1.SQL.Text := 'SELECT COUNT(*) FROM Orders WHERE Amount=''1000'';'; 
    // 
    // "execute" it 
    // 
    UniQuery1.Open; 
    // 
    // SELECT COUNT(*) will return 1 record with 1 field 
    // most likely the field name is 'count' <= lower case 
    // but we are sure that there should be only 1 field so we 
    // access it by Fields[Index].As[TYPE] 
    // 
    LCount := UniQuery1.Fields[0].AsInteger; 
    ShowMessageFmt('Total count of orders with Amount = 1000: %d', [LCount]); 
end; 

EDIT: danke für Hinweis darauf, dass "COUNT" immer eine Rückkehr haben wird.

+4

Offensichtlich gibt diese bestimmte Abfrage immer ein Ergebnis zurück, außerdem gibt sie einen Wert zurück (im Gegensatz zu NULL), weil 'COUNT()' immer einen Wert liefert, niemals einen NULL. So kann der 'not IsEmpty' Test in diesem Fall entfallen. –

+1

@ Andriy hat Recht. Das 'UniQuery1.FindFirst' wird ebenfalls nicht benötigt. – kobik

+2

Ich weiß nicht 'TUniQuery', aber ist das Dataset nicht bereits in der ersten Zeile, nachdem' TUniQuery.Open' ausgeführt wurde? Wäre nicht genug etwas wie 'UniQuery1.Open; LCount: = UniQuery1.Fields [0] .AsInteger; '? – TLama