![]() |
Datenbank: MSSQL Server • Zugriff über: gerne ADO
ADO Daten übergabe
Hallo zusammen
ich möchte gerne eine SOAP server-anwendung schreiben welche mir informationen aus einer SQL-tabelle geben soll. die procedure sollten etwa so aussehen:
Delphi-Quellcode:
hat irgend jemand eine idee wie ich diese daten übergeben kann?
function TSQLService.GetMWSt(const SQLString: Double): (irgendeine Variable);
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(SQLString); ADOQuery1.Open; // Daten übergabe end; vielen danken im voraus |
Re: ADO Daten übergabe
Da gibt es mehrere Varianten. Zwei davon möchte ich ich kurz anschneiden.
Die Erste Variante kannst du nutzen ohne Änderunegn an der DB zu machen: Rufe die Funktion wie folgt auf:
Delphi-Quellcode:
Die AdoQuery liefert also nur eine Spalte mit dem Namen MwST zurück ...
MwSTValue:=GetMWSt('SELECT MwST FROM Position WHERE PosNr=1313' );
case MwStValue of -1: ShowMessage('Die Abfrage liefert keine Rückgabemenge'); -2: ShowMessage('Die Abfrage liefert mehr als einen Datensatz'); -3: ShowMessage('Die Abfrage einen ungültigen Wert für MwSt'); end; if MwStValue<0 then exit; ... ... Daher kannst du die function wie folgt umbauen
Delphi-Quellcode:
-----------------------------------------------------------------------------------------
function TSQLService.GetMWSt(SQLString:String): Double;
var t:Variant; begin ADOQuery1.Close; ADOQuery1.SQL.text(SQLString); ADOQuery1.Open; // Rückgabe der Query rrüfen case AdoQuery1.RecordCount of 1: t:=AdoQuery1.FieldValues['MwSt'] ; // Nimm den Wert aus dem Feld 0: t:=-1 ; // SELECT verweist auf keinen Datensatz, "Kennung -1" 2..999999999999999: t:=-2 // SELECT verweist nicht eindeutig auf einen Datensatz "Kennung -2" end; AdoQuery1.close; // Inhalt von "t" prüfen if VarType(t) <>VarNULL begin if not TryStrToFloat(t) then t:=-3 ; // -3 = Kennung für ungültigen Wert end else begin t:=-3; end; result:=t; end; Variante 2 halte ich für wesenflich besser, weil fest codierter SQL Code fast immer ein Klotz am Bein ist. Ausserdem möhlt man sich das Projekt unnötig mit Komponenten voll und eine SP kann man auch mal schmell beim Kunden umstricken, falls dieser mal wieder Sonderwünsche hat ... Baue die auf dem SQL-Server eine SP z.B.
SQL-Code:
In Delphi würde ich das dann so aufrufen
CREATE PROCEDURE dbo.GetPositionMwSt
@PosNr INT = NULL, @MwSt DECIMAL = NULL OUTPUT; AS BEGIN IF @PosNr IS NULL BEGIN SET @MwSt = -1 -- Kennung für "kein Datensatz" RAISERROR('Die SP muss mit einer Positionsnummer aufgerufen werden !',16,1,'SQL') END ELSE BEGIN SELECT @MwSt = MwSt From Positionen WHERE PosNr = @PosNr IF @MwSt IS NULL SET @MwST = -3 -- Kennung für "ungültiger Wert" IF @@RECORDCOUNT = 0 SET @MwST = -1 -- Kennung für "kein Datensatz" IF @@RECORDCOUNT > 1 SET @MwST = -2 -- Kennung für "zu viele Datensätze" END END;
Delphi-Quellcode:
function TSQLService.GetMWSt(PosNr:Integer): Double;
var SP:TAdoStoredProc; begin SP:=TAdoStoredProc.create(self); SP.Connection:=Datamodule1.AdoConnection1; // Hier deine AdoConn try SP.Procedurename:='GetPositionMwSt'; SP.Parameters.refresh; SP.Parameters[1].Value:=PosNr; SP.ExecProc; Result:=SP:Parameters[2].Value; finally FreeAndNil(SP); end; Hoffe es hilft, Schöne Grüße, Jens :hi: |
Re: ADO Daten übergabe
mh das ist nicht ganz das was ich brauchen.
Das resultat muss alle zeilen enthalten die ich abgefragt habe. also ich gebe den SQL string an die Procedure und erhalte nachher eine Variable die ich als liste Darstellen kann. danke aber für die Idee |
Re: ADO Daten übergabe
Dann also eher Sowas ?
Delphi-Quellcode:
;
Function irgendwas():TStrings;
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.text:='SELECT MWST FROM TABELLE1 WHERE...'; ADOQuery1.Open; MeineListe.Clear; While not ADOQuery1.eof do begin MeineListe.add(ADOQuery1.fieldbyname('MWST').asstring; ADOQuery1.next; end; Result:=MeineListe; end |
Re: ADO Daten übergabe
Jetzt nur noch unbekannt viele spalten weil die abfragen dynamisch sein können.
|
Re: ADO Daten übergabe
Dann kannst du das eventuell so machen (Kanns grade nicht testen ...)
myArray = mehrdimensionales DynArray, Eine TObjectlist oder was du gern verwendest
Delphi-Quellcode:
While not ADOQuery1.eof do
begin for i:=0 to AdoQuery1.fields.count.1 do begin MyArrAy[AdoQuery1.recno-1,i] := AdoQuery1.fields[i].asstring; end; ADOQuery1.next; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz