![]() |
Stored Procedure ignoriert DB-Einstellungen
Hallo,
Ich habe hier ein kleines Problem mit einer StoredProc. In meiner Interbase-DB befinden sich Felder, die nicht NULL sein dürfen. Wenn ich diese Felder direkt auf der DB ändere bekomme ich Fehlermeldung. Wenn ich jedoch die Felder mit der Procedure einfüge, werden die Einstellungen einfach iknoriert. Nun habe ich mir ein kleines TestProg gebastelt und kann nun einmal ein Dataset und einmal die StoredProc nehmen. Wenn ich die Daten über die Dataset speicherebekomme eine Fehlermeldung, bei der StoredProc hingegen wird die Einstellung einfach übergangen. Wie kommt das? Muß ich in der StoredProc noch etwas einstellen oder ist das einfach so und ich muß vorher selber prüfen ob es alles richtig ist? Hier meine StoredProc:
Code:
Und so rufe ich Stored Proc im Programm auf:
REATE PROCEDURE PROCINSERT (
FNAME VARCHAR (40), FPLZ CHAR (5), FORT VARCHAR (40)) AS BEGIN Insert into test1 (Name, PLZ, Ort) Values (:fName,:fPlz,:fOrt); SUSPEND; END
Code:
[edit=sakura] Der Rechtschreibfehler im Titel tat weh :mrgreen: Mfg, sakura[/edit]
If Form1.RadioButton2.Checked = True Then
Begin With IBSPMain DO Begin ParamByName('fName').Value:= Edit2.Text; ParamByName('fPLZ').Value:= Edit3.Text; ParamByName('fOrt').Value:= Edit4.Text; ExecProc; end; IBTMain.Commit; end; |
Re: Stored Procedure iknoriert DB-Einstellungen
Erstmal ist in Deiner Procedure ein Fehler: SUSPEND ist falsch, dies ist nur dazu da Werte Deiner Procedure zurückzuliefern. Du hast aber keine Rückgabeparameter definiert.
Zitat:
SQL-Code:
Code der Procedure:
select status from procinsert(:fname,:fplz,:fort)
Code:
Und hier das entsprechende Snipset aus Deinem Testprogramm:
CREATE PROCEDURE PROCINSERT (
FNAME VARCHAR (40), FPLZ CHAR (5), FORT VARCHAR (40) ) RETURNS ( STATUS INTEGER ) AS BEGIN STATUS = 0; Insert into test1 (Name, PLZ, Ort) Values (:fName,:fPlz,:fOrt); suspend; WHEN ANY DO BEGIN STATUS = 1; SUSPEND; END END
Delphi-Quellcode:
Gruß,
If Form1.RadioButton2.Checked = True Then
Begin IBTMain.StartTransaction; With MyIBDataSet DO Begin ParamByName('fName').Value:= Edit2.Text; ParamByName('fPLZ').Value:= Edit3.Text; ParamByName('fOrt').Value:= Edit4.Text; Open; if FieldByName('STATUS').AsInteger = 0 then IBTMain.Commit else begin IBTMain.Rollback; ShowMessage('Fehler aufgetreten!'); end; end; end; Marcel |
Re: Stored Procedure iknoriert DB-Einstellungen
Hi,
Zitat:
Warum zum Geier bist Du übrigends auf die kryptische Fehlermeldung des Datenbankservers scharf? Kontrollier doch gleich in der Client-Anwendung, ob alle benötigten Daten eingegeben wurden. Glaubst Du echt, ein unbedarfter User kann mit
Code:
was anfangen???
ISC ERROR CODE:335544347
ISC ERROR MESSAGE: validation error for column PLZ, value "*** null ***" Statement: insert into Adresse (Name) values ('1'); Grüße Lemmy P.S.: Warum hat Dir übrigends der Thread von gestern nicht gereicht??? |
Re: Stored Procedure iknoriert DB-Einstellungen
Hallo Marcel,
Ich habe jetzt alles so gemacht, wie du geschrieben hast. Aber der Status bleibt immer NULL ob ich da nun ein Feld leer lasse oder nicht. Liegt es an den Einstellungen der DB oder wie. Den wie schon gesagt, wenn ich das über InsertSQL der DataSet mache, bekomme ich ja ne Fehlermeldung das und das Feld nicht leer sein dürfen. |
Re: Stored Procedure iknoriert DB-Einstellungen
Zitat:
Wenn ich das also jetzt richtig verstanden habe, sendet die DataSet die Daten so wie sie sind (also nicht gecastet) und die StoredProc wandelt sie bevor es zur DB geschickt wird in den jeweiligen Typ um. Nun gleich das nächste. Wenn es da solch gravierende Unterschiede zwischen der Dataset und StoredProc gib, welche der beiden verwendet man am besten? Die Insert...,UpdateSQL usw oder StoredProc-Kompo? |
Re: Stored Procedure iknoriert DB-Einstellungen
HI Albi,
ich verwende eigentlich fast immer die TIBDataset (oder vergleichbares), da die TIBStoredProc keinen Int64-Typ unterstützt. Ich habe allerdings keinen Plan von den internen Abläufen, wenn ein IBDataSet mit einem DBEdit verbunden ist und dort die Wertezuweisung abläuft. Grundsätzlich ist es sinnvoller bei Client/Server-DBs nicht die datensensitiven Komponenten (DBEdit) zu verwenden, sondern "normale" Komponenten und die Wertzuweisung manuell vorzunehmen. Nur so kann die schreibnende Transaktion so kurz wie möglich geöffnet werden und die Warscheinlichkeit eines Deadlocks ist äußerst gering bzw. mach verwendet entsprechende Komponenten die das unterstützen (z.B. die FIBPlus habe eine ReadTransaction und eine WriteTransaction!). Grüße Lemmy |
Re: Stored Procedure ignoriert DB-Einstellungen
Die DBEdit verwende ich ja überhaut nicht. Ich verwende "normale" Edit aber ich habe es bis jetzt immer noch gehandhabt, das ich alles wo ich Daten aufrufe über die DataSet gemacht habe, da ich damit durch die Daten Scrollen kann. Und die TIBStoredProc nur zum speichern und lösen.
Dann werd ich mal :coder: Vielen Dank für die Erklärung. Ich habe es jetzt begriffen. |
Re: Stored Procedure ignoriert DB-Einstellungen
2 Dinge:
|
Re: Stored Procedure ignoriert DB-Einstellungen
Das habe ich noch gar nicht so gesehen, ich bin nur davon ausgegangen das ein CHAR kleiner ist als ein VARCHAR und da eine Postleitzahl eh immer 5 Stellen hat, habe ich mir darüber keine Sorgen gamacht.
Und der Grund warum ich die Dataset nur zum durchblättern der Datensätze nehme war nur dieser, das ich gelesen habe, wie so vieles, das die IBStoredProc einfach schneller ist als die Dataset. Aber mittlerweile denke ich, das eine DataSet wesentlich bequemer ist als die StoredProc. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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 by Thomas Breitkreuz