Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi INSERT INTO sonst UPDATE! (https://www.delphipraxis.net/44175-insert-into-sonst-update.html)

Peeters 19. Apr 2005 19:28

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

jensw_2000 19. Apr 2005 22:09

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:
  @FormNr INT = NULL
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 ...

:hi:

Peeters 20. Apr 2005 16:41

Re: INSERT INTO sonst UPDATE!
 
Ich habs, ich depp, habe nicht daran gedacht das @FormNr VARCHAR ist. Jetzt geht es.
Delphi-Quellcode:
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
Langsam steige ich dahinter. Mal schauen wie es weiter geht.

tyron78 18. Okt 2005 23:24

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:
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
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.
Diese Procedure rufe ich in Delphi in einer Funktion wie folgt auf:

Delphi-Quellcode:
  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;
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?

mfg

Ty

Hansa 19. Okt 2005 00:11

Re: INSERT INTO sonst UPDATE!
 
wie wärs hiermit ?
into :par_found;

tyron78 19. Okt 2005 21:43

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...

tyron78 20. Okt 2005 06:42

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:

marabu 20. Okt 2005 07:40

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:
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
Grüße vom marabu

tyron78 20. Okt 2005 08:04

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

tyron78 20. Okt 2005 16:29

Re: INSERT INTO sonst UPDATE!
 
AAAARGHS: So etwas triviales! Das ganze hätte schon wesentlich früher richtig gefunzt, wenn ich nicht

SQL-Code:
 where parameter_id = :pi_parameter_id;
sondern

SQL-Code:
 where upper(parameter_id) = upper(:pi_parameter_id);
geschrieben hätte... im IBExpert hatte ich wohl zufällig die ID groß eingegeben...

thx trotzdem für alle Tips! Hab auch das Into entsprechend angepaßt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr.
Seite 3 von 3     123   

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