Ich beschäftige mich gerade mit Firebird.
Soweit funktioniert es ja auch.
In meinem Programm existiert ein Editfeld,
in das ich die SQL-Befehle für @db("fbSQLExec",...)
reinschreibe . Also (INSERT, SELECT FROM usw.)
Per Button lese ich die Eingabe in eine Variable (SQL$)
und schicke das an ab.
Nun meine Frage :
Manchmal kommt es vor, daß man die SQL-Befehle nicht
richtig schreibt. Dann steigt natürlich Firebird mit einem
Fehler aus und das ganze Prog wird beendet.
Kann man so einen Fehler irgendwie abfangen ?
Das Programm soll ja weiterlaufen bzw. mit einem
vom Benutzer korrigierten SQL-Befehl weiterarbeiten.
Kann ja sein, daß jemand schon was versucht hat.
Wird wahrscheinlich sehr schwierig, da alles über DLLs
gemanaged wird.
Firebird
-
-
-
Hallo H.Brill!
Ohne dass ich mich jetzt mit Firebird oder SQL auskenne, würde ich so vorgehen.
1.) Eine Liste mit allen Befehlen suchen (Internet und Co.)
2.) Die Liste als Vergleichsdatenbank einlesen (vielleicht mit Semikolon getrennt)
3.) Bei Betätigung des Buttons ein Vergleich mit der Vergleichsdatenbank aufrufen
4a.) Wenn Befehl OK, dann an Variable übergeben
4b.) Wenn Befehl unbekannt, vordefinierte Aktion ausführen
LG Jens -
Naja, so einfach ist es auch nicht.
Die SQL-Befehle sind ja auch abhängig
von den Feldern der Datenbank und werden
auch so gemischt geschrieben, z.B. :SQLSELECT * FROM KUNDE WHERE KUNDENNR = 4711 SELECT * FROM KUNDE WHERE NAME = 'Maier' SELECT * FROM KUNDE WHERE NAME LIKE 'M_ier'
Hier ist KUNDE die DB und KUNDENR + NAME ein Feld.
Wenn die Suchbegriffe 4711 und 'Maier' nicht stimmen,
wirds halt nicht gefunden. Das ganze geht schon los, wenn
ein Feld nicht richtig geschrieben ist, z.B. KUNDENR statt
KUNDENNR o.ä. Da nützt mir auch keine Internet-Datenbank,
sondern nur eine ordentliche Fehlermeldung, daß das Feld
nicht existiert. Die bekomme ich ja, aber das Programm
wird geschlossen. Genau da will ich ansetzen, um das Feld
zu korrigieren und erneut den SQL-Befehl absetzen.
Wäre so ähnlich, wie ein ROLLBACK -> SQL-Befehl wird verworfen
und die DB auf Normalzustand zurückgesetzt.
Einen Eindruck kannst du dir ja in der Profanhilfe unter
SQL verschaffen. -
Zitat
Das ganze geht schon los, wenn ein Feld nicht richtig geschrieben ist, z.B. KUNDENR statt KUNDENNR o.ä. Da nützt mir auch keine Internet-Datenbank, sondern nur eine ordentliche Fehlermeldung, daß das Feld nicht existiert.
Das mit der Internet-Datenbank hast Du falsch verstanden. Ich bin davon ausgegangen dass es irgendwo im Internet eine Datei gibt wo alle Befehle drin stehen. Da das nicht so ist musst Du eben irgendwie eine Möglichkeit finden „Deine Befehle“ zu vergleichen. So in etwa dachte ich mir das:
Code
Alles anzeigenDeclare hED&, hBT&, Tmp$, Fehler% Var Vergleich$ = "SELECT;*;FROM;KUNDE;WHERE;KUNDENNR;NAME;LIKE" ' Vergleichsstring Cls hED& = Create("Edit",%hwnd,"",10,10,300,24) hBT& = Create("BUTTON",%hwnd,"senden",320,10,80,24) Locate 5,0 Print "Übergabe: " Proc vergleichen Parameters BF$ Declare BF_Data$ Var Flag% = 0 Var End% = 0 Var A% = 0 WhileNot End% Inc A% BF_Data$ = SUBSTR$(Vergleich$,A%,";") ' Befehl extrahieren Case BF_Data$ = BF$ : Flag% = 1 ' Vergleich OK Case Len(BF_Data$) = 0 : End% = 1 EndWhile Return Flag% EndProc While 1 WaitInput If Clicked(hBT&) Fehler% = 0 WhileLoop 1, 100 Tmp$ = SUBSTR$(GetText$(hED&),&Loop," ") ' Befehle einlesen If (Tmp$ = "=") Or (Len(Tmp$) = 0) ' Endbedingung Break ' While verlassen else ' Befehlsbedingung IfNot vergleichen(Tmp$) MessageBox("Unbekannter Befehl: "+Tmp$,"Fehler",16+262144) ' Fehlermeldung - Datei erstellen Fehler% = 1 EndIf EndIf EndWhile If Fehler% = 0 Locate 5,0 Print "Übergabe: "+GetText$(hED&)+" " ' Übergabe SetText hED&,"" else Locate 5,0 Print "Übergabe: " ' Übergabe EndIf EndIf EndWhile
Der Knackpunkt ist mehr oder weniger wie Du die Daten in den „Vergleich$“ rein bekommst...
LG Jens -
Übernimm doch das Fehlerhandling selbst. Schau dir mal ERRORPROC in der Hilfe an. Das dürfte dein Problem lösen
-
Ist zwar gut gemeint, aber
ERRORPROC greift ja NUR bei den Profaneigenen
Befehlen/Funktionen.
Den Fehler, den die fbembeded.dll als Messagebox
auswirft, kann ERRORPROC natürlich nicht behandeln.
Somit ist ERRORPROC hierfür nutzlos.
Mein Vorhaben gelingt nur, wenn Firebird embeded
dafür was anbietet. Habe aber leider in der Doku
noch nichts gefunden. -
Hallo, ich erlaube mir mal hier eine Klarstellung:
Die Messagebox wird tatsächlich in XProfan erzeugt, die Frebird-DLL liefert zunächst nur einen Fehlercode und auf Anfrage dann den Fehlertext. Den zeige ich dann in der Messagebox an.
Diese Messagebox wird abhängig vom Error-Level angezeigt:
-1: überhaupt nicht
0: Als Warnung: Bei "OK" läuft das Programm weiter
1: Als Fehler: Bei "Ok" wird das Programm mit Returncode 5 beendet.Tatsächlich ist ERRORPROC an dieser Stelle nutzlos, weil es keine "normale" XProfan-Fehlermeldung ist.
Was hier tatsächlich noch hilfreich wäre, eine Systemvariable mit dem Fehlertext zu füllen, um im Programm abzufragen, ob ein Firebird-Fehler aufgetreten ist. Das nehme ich als Antregung für die nächste Version mit. (Vielleicht kann ich sogar die bestehende Systemvariable $SQLError nutzen ...)
Gruß
Roland -
Vielen Dank, Roland.
Das mit dem Errorlevel wußte ich nicht, daß dieser
auch hier wirkt.
Mit
ist mir ja schon im Grunde geholfen.
Das zeigt mir dann die MSG-Box an und bei OK
kann das Prog weiterlaufen, bzw. man kann seinen
SQL-Befehl korrigieren und erneut absenden.
PS: Ich habe mal mit ImportDLL die Funktionen
der fbembed.dll aufgelistet. Da sind ja auch solche
Funktionen wie gds__put_error und isc_print_sqlerror
drin. Scheint auch sonst noch viel Potential in der
embeded - Variante zu stecken.
Nochmals danke, es kann doch so einfach sein.
Nur darauf kommen muß man.
Vielleicht könnte man die Meldungen noch etwas
'eindeutschen' , weil z.B.
nicht jedem verständlich ist. Da wäre vielleicht
o.ä. verständlicher. -
Zitat von H.Brill;978519
Aber möglichst nur als Ergänzung zur engl. Ausgabe, weil in der Dokumentation
zu Firebird und SQL ist wohl nur die Orginal-Fehlermeldung behilflich bei der
Suche nach dem Problem. -
Hätte da noch eine rein 'kosmetische'
Angelegenheit. Könnte man bei
es so steuern, daß die Spaltenbreiten bei Ausgabe in
eine selbst erstellte Gridbox erhalten bleiben ?
Obwohl ich bei Erstellung der Gridbox die gleichen
Feldnamen auch als Spaltennamen habe, drückt mir
fbSQLExec die Spalten enger zusammen. Die kann man
zwar mit der Maus wieder rausziehen, aber schöner wäre
es, wenn die Spaltenbreiten von meiner erstellten
Gridbox übernommen würden.
Sieht so aus, als wenn Firebird die Ausmaße, die beim
Erstellen der DB angegeben wurden, übernimmt.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!