![]() |
Re: INSERT INTO sonst UPDATE!
Ich habe direkt in den Eigenschaften einen Wert eingetragen um das Verhalten erst einmal zu testen. Ich habe das auch mit einer einfachen SELECT Anweisung ausprobiert, und es kam zu einen Ergebnis.
Delphi-Quellcode:
CREATE PROCEDURE SP_IMPORT_FORM
@FormNr VARCHAR(5) = NULL AS SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr GO |
Re: INSERT INTO sonst UPDATE!
Hm... :gruebel:
ausser das du bei deinem bedingten SELECT den Datentyp (INT) verwendest, aber @FormNr als VARCHAR deklarierst finde ich keine Fehler ...
SQL-Code:
@FormNr VARCHAR(5) = NULL -- hier sollte INT = NULL stehen
AS IF @FormNr < 10000 -- wenn du hier den Parameter gegen eine Integer vergleichst Der MSSQL ist zwar meistens kulant bei unterschiedlichen Datentypen (insofern die Daten richtig interpretiert werden können), aber es ist der letzte offensichtliche Fehler ... Probier doch mal deinen Parameter in der SP anzupassen ...
SQL-Code:
Nachdem du die SP gespeichert hast, musst du deine ADOSP im Delphi disconnecten, neu connecten und die Parameter neu auslesen sonst bekommt ADO nicht mit, das sich die Parameterdeklaration geändert hat ...
@FormNr INT = NULL
:hi: |
Re: INSERT INTO sonst UPDATE!
Ich habs, ich depp, habe nicht daran gedacht das @FormNr VARCHAR ist. Jetzt geht es.
Delphi-Quellcode:
Langsam steige ich dahinter. Mal schauen wie es weiter geht.
CREATE PROCEDURE SP_IMPORT_FORM
@FormNr VARCHAR(5) = NULL AS IF @FormNr = '00475' BEGIN SELECT * FROM MPK_FORM WHERE FORMNR = @FormNr END ELSE BEGIN SELECT * FROM MPK_PREIS WHERE FORMNR = QFormNr END GO |
Re: INSERT INTO sonst UPDATE!
Hallo, liebe DPler.
Bin grad über die Suche auf den thread hier gestoßen, und da mein Problem ein ähnliches ist und ich (mal wieder) etwas festhänge, dachte ich, ich poste mal: Ich greife auf eine Interbase DB zu, in der ich folgende stored procedure habe:
SQL-Code:
Die beiden :PI_ Variablen sind meine Input-Parameter, :PO_ entsprechend der Output-Parameter. par_found ist eine integer-Variable der Procedure. Das ganze hab ich im IB-Expert schon getestet und es scheint auch soweit korrekt zu laufen.
begin
select count(*) from mcsc_parameter where upper(parameter_id) = upper(:pi_parameter_id) into par_found; if (par_found = 0) then insert into mcsc_parameter values (:pi_parameter_id, :pi_parameter_value); else update mcsc_parameter set parameter_value = :pi_parameter_value where parameter_id = :pi_parameter_id; po_ret_val = par_found; suspend; end Diese Procedure rufe ich in Delphi in einer Funktion wie folgt auf:
Delphi-Quellcode:
Rufe ich jetzt (z.B. in einem Button-Pressed Event) diese Funktion mit zwei Parametern auf und laß mir das Ergebnis ausgeben, so erhalte ich erwartungsgemäß das Ergebnis der stored Proc, nämlich die Anzahl der vorhandenen Parameter in der Tabelle, die dem ersten Parameter entsprechen (im Normalfall 0 oder 1). Schaue ich jedoch dann in die DB, wurde weder Update noch Insert ausgeführt (was im IB Expert aber funktioniert hat). Commit kann ich aus der Procedure nicht aufrufen und das Commit der default transaction ändert auch nichts... irgendeine Idee, woran das liegen kann?
function TDataModule2.MCSC_Put_Param_Value(par_id, par_val: string): String;
var par_ind: integer; begin; if par_id = '' then par_id := 'DUMMY'; par_id := Uppercase(par_id); self.MCSC_StoredProc_IB_1.StoredProcName := 'MCSC_PUT_PARAMETER'; par_ind := self.MCSC_StoredProc_IB_1.ParamByName('PI_PARAMETER_ID').Index; self.MCSC_StoredProc_IB_1.Params[par_ind].Value := par_id; par_ind := self.MCSC_StoredProc_IB_1.ParamByName('PI_PARAMETER_VALUE').Index; self.MCSC_StoredProc_IB_1.Params[par_ind].Value := par_val; self.MCSC_StoredProc_IB_1.ExecProc; par_val := self.MCSC_StoredProc_IB_1.Params.ParamValues['PO_RET_VAL']; Result := par_val; end; mfg Ty |
Re: INSERT INTO sonst UPDATE!
wie wärs hiermit ?
into :par_found; |
Re: INSERT INTO sonst UPDATE!
Aber was ändert da das :par_found? Wie gesagt: der Rückgabewert scheint ja korrekt zu sein, aber es wird halt nichts committed, wenn ich die proc aus delphi heraus ausführe...
|
Re: INSERT INTO sonst UPDATE!
Woran kann es denn nun liegen, daß nicht commited wird??? Wie gesagt: im IB-Expert funzt die stored procedure! Nur beim Aufruf über Delphi nicht! :-(( Muß man explizit ein Commit absetzen? Wenn ja, welches? :gruebel: Das Commit der Standard Transaktion hat nichts bewirkt... ich kapiers einfach nich! :wall:
|
Re: INSERT INTO sonst UPDATE!
Nicht, dass ich deinen Code ausprobiert hätte - oder gar meinen - aber müsste er nicht so aussehen?
SQL-Code:
Grüße vom marabu
begin
select count(*) from mcsc_parameter where upper(parameter_id) = upper(:pi_parameter_id) into :po_ret_val; if (po_ret_val = 0) then insert into mcsc_parameter values (:pi_parameter_id, :pi_parameter_value); else update mcsc_parameter set parameter_value = :pi_parameter_value where parameter_id = :pi_parameter_id; suspend; end |
Re: INSERT INTO sonst UPDATE!
Hm... klingt plausibel - werd ich nachher mal ausprobieren. Aber hat das was mit dem Commit bzw. dem Fehlen des selbigen zu tun?
Beispiel: in meiner DB hab einen Parameter dummy mit dem Wert test. Führe ich im IB Expert die Procedure mit den Parametern dummy und test5 aus, steht hinterher in der DB dummy und test5. Starte ich das ganze aus Delphi und schaue danach per IB Expert in die DB steht da immernoch dummy und test |
Re: INSERT INTO sonst UPDATE!
AAAARGHS: So etwas triviales! Das ganze hätte schon wesentlich früher richtig gefunzt, wenn ich nicht
SQL-Code:
sondern
where parameter_id = :pi_parameter_id;
SQL-Code:
geschrieben hätte... im IBExpert hatte ich wohl zufällig die ID groß eingegeben...
where upper(parameter_id) = upper(:pi_parameter_id);
thx trotzdem für alle Tips! Hab auch das Into entsprechend angepaßt... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 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