Ingrid: unterbrechen

Hallo

Ich habe folgendes Problem:
Ich habe eine Webseite, wo der User was eingeben kann und das sollte dann
aus der Datenbank gezogen und dargestellt werden.
Das funktioniert eigentlich auch. Nur wenn der User einen Wert eingibt, der
nicht in der DB vorhanden ist, dann checke ich das und schreibe 'ne Meldung
auf den Bildschirm. Dann aber laeuft das Programm weiter.
Ich habe schon alles moegliche versucht, um das Programm nach der Meldung zu
stoppen, aber bisher hat nichts funtkioniert.
Wie muss ich das denn machen?

Gruss
Ingrid

  1. Hi Ingrid,

    du solltest entsprechend programmieren, was im einzelnen bedeutet, mit sub, "function", "exit" "sub|function" zu arbeiten.

    Vorgänge wie Datenbankupdates oder Datenbankfetches etc lassen sich gut in function blöcken kapseln und können damit auch rückgabewerte haben, die sich auswerten lassen.

    wenn suche = erfolgreich dann starte Prozedur DBAusgabe sonst schreibe HTML-Meldung

    GOTO-Sprungbefehle aus dem richtigen VB funktionieren in VBScript leider nicht, schade eigentlich!

    HTH, Ciao, Frank

    1. Hallo,

      im VB gibt es noch GOTO?

      ist es nicht bewiesen worden, das jedes Programm ohne GOTo auskommen kann?

      Eine andere Untersuchung zeigte, das mit zunehmender anzahl der goto's auch die programmfehler anstiegen...

      Odium

      1. Hallo,

        im VB gibt es noch GOTO?

        ist es nicht bewiesen worden, das jedes Programm ohne GOTo auskommen kann?

        Eine andere Untersuchung zeigte, das mit zunehmender anzahl der goto's auch die programmfehler anstiegen...

        Odium

        Hi Odium,

        1.) in der 6er Pro von VB gibt es noch GOTO

        2.) sicher kann jedes Programm ohne GOTO auskommen

        3.) mag sein, vernünftig angewendet bietet es aber gute Möglichkeiten, Ausnahmen abzufangen bzw. auf Benutzerblödheit zu reagieren. z.b. packe ich in Prozeduren mit vielen offenen Recordsetobjekten immer einen entsprechenden Block ans Ende, wo alle offenen Sachen sauber geschlossen und gekillt werden. Diesen block kann ich bequem von überall in der Prozedur ansteuern, wenn beispielsweise ein EOF auftritt, was mir nicht gefällt und welches die Prozedur brechen würde...

        Verwendung gezielt und in Maßen lautet die Devise

        Tschau, Frank

  2. Hallo Ingrid,

    lösen die GOTO Antworten eigentlich Dein Problem ? Ich hätte eher gedacht, dass Du ein Kriterium brauchst, nachdem ein Datenbank-Zugriff eben _nicht_ durchgeführt wird, wenn ein Eingabe-Problem vorliegt. Was verstehst Du in diesem Zusammenhang unter "Programm weiterlaufen" ? Wenn ein User Daten in ein Form eingegeben hat und abschickt, wird vermutlich eine (Auswerte-)ASP-Datei aufgerufen und der ASP-Parser tut, was er tun soll (Datenbank-Abfrage bei gültigen Daten) und tut hoffentlich nicht, was er nicht tun soll (keine Datenbank-Abfrage bei fehlerhaften Daten).
    Kannst Du also Dein Problem noch etwas präzisieren ?

    Ciao
    Hans-Peter

    1. Hallo Ingrid,

      lösen die GOTO Antworten eigentlich Dein Problem ? Ich hätte eher gedacht, dass Du ein Kriterium brauchst, nachdem ein Datenbank-Zugriff eben _nicht_ durchgeführt wird, wenn ein Eingabe-Problem vorliegt. Was verstehst Du in diesem Zusammenhang unter "Programm weiterlaufen" ? Wenn ein User Daten in ein Form eingegeben hat und abschickt, wird vermutlich eine (Auswerte-)ASP-Datei aufgerufen und der ASP-Parser tut, was er tun soll (Datenbank-Abfrage bei gültigen Daten) und tut hoffentlich nicht, was er nicht tun soll (keine Datenbank-Abfrage bei fehlerhaften Daten).
      Kannst Du also Dein Problem noch etwas präzisieren ?

      Ciao
      Hans-Peter

      Hi Hans-Peter,

      um GOTO ging es gar nicht, sondern um die Kapselung von klassifizierbaren Aktionen (DB Insert/SELECT sonstwas) in Prozeduren und Funktionen mit Rückgabewerten.

      Bei Ingrid kann ich mir das so vorstellen:

      <%
      IF Request.FOrm("name") = "" THEN
         Response.Write "Sie haben keinen Namen angegeben"
      END IF

      '// hier soll das Script aber eigentlich aufhören mit arbeiten

      strSQL = "SELECT * FROM tbl1 WHERE NAme='" & name & "'"
      set rsSQL = conn.execute(strSQL)

      ....

      ....

      %>

      Programmiertechnik ....

      eine genaue Problemspezifikation wäre aber vielleicht ganz nützlich... bzw. ist immer zweckdienlich...

      Gruß, Frank

      1. Hi

        um GOTO ging es gar nicht, sondern um die Kapselung von klassifizierbaren Aktionen (DB Insert/SELECT sonstwas) in Prozeduren und Funktionen mit Rückgabewerten.

        ja eben ...

        <%
        IF Request.FOrm("name") = "" THEN
           Response.Write "Sie haben keinen Namen angegeben"

        ELSE
              strSQL = "SELECT * FROM tbl1 WHERE NAme='" & name & "'"
              set rsSQL = conn.execute(strSQL)

        END IF

        %>

        ... vom Prinzip her zumindest.

        Ciao
        Hans-Peter

        1. Hi

          um GOTO ging es gar nicht, sondern um die Kapselung von klassifizierbaren Aktionen (DB Insert/SELECT sonstwas) in Prozeduren und Funktionen mit Rückgabewerten.
          ja eben ...
          <%
          IF Request.FOrm("name") = "" THEN
             Response.Write "Sie haben keinen Namen angegeben"
             ELSE
                strSQL = "SELECT * FROM tbl1 WHERE NAme='" & name & "'"
                set rsSQL = conn.execute(strSQL)
          END IF
             %>
          ... vom Prinzip her zumindest.
          Ciao
          Hans-Peter

          Hi,

          genau jenes Prinzip!

          Tschau und schönen Feierabend
          Frank

        2. Hallo

          also, ums nochmal ein bisschen genauer zu machen.
          Ich habe eine Seite mit Formular, wo der User einen Wert eingibt.
          Beim Abschicken wird eine andere Seite geoeffnet, an einer bestimmten Stelle (ein case in einem select). Dort mache ich eine adodb-connection auf und selektiere mit dem Wert des Users was aus einer DB.
          Wenn nun dieser Wert in der DB nicht existiert, so soll das Script abbrechen. Es steigt aber nur aus dem select/case aus und durchlaeuft dann aber den Rest des Scriptes. Und eben das will ich nicht.
          Zur Zeit habe ich's so geloest, dass ich dann ein neues Fenster aufmache, dort mit js ein window.close abschicke. Das funktioniert, ist aber nicht gerade das Gelbe vom Ei.
          Gibts da eine schoene Loesung?

          Gruss
          Ingrid

          1. Hallo Ingrid,

            wäre es nicht ganz einfach möglich, dass Du in genau jenem case-Statement nach der Ausgabe der Fehlermeldung ein Flag setzt, das einen Fehlerzustand signalisiert. Und nach dem kompletten select-Befehl führst Du die Datenbank-Abfrage nur aus, wenn dieses (und ggf. noch weitere) Fehlerflag _nicht_ gesetzt ist (sind) ?

            Mit Client-seitigen Mechanismen würde ich da - ohne Not - nicht rum machen, wenn Du ASP zur Verfügung hast. Und das Eltern-Fenster einfach abschießen ... hm, wie soll ich sagen: Du bist sicher schon sehr verzweifelt an dem Problem, stimmts ?  :-)

            Ciao
            Hans-Peter

  3. Hallo,

    nicht in der DB vorhanden ist, dann checke ich das und schreibe 'ne Meldung
    auf den Bildschirm.

    und gibst alle Resourcen frei bzw. schließt die offenen Verbindungen und rufst Response.End() auf, womit die Bearbeitung abgeschlossen wird.

    Oder du legst alles in einen try-catch-Block (JScript) bzw. setzt ein onerror (VBScript) und löst eine Exeption aus. Abfangen tust du dies sinnigerweise am Ende der Seite.

    also 1.
    if (_Falsche_Eingabe_) {
      _Resourcen_frei_geben;
      _Fehlermeldung_schreiben;
      Response.End();  //- Hier ist Schluß
    }

    oder 2.
    try {
      _Mein_Script_;

    if (_Falsche_Eingabe_)
        throw "Falsche Eingabe"; //- Exeption auslösen, sofern nötig

    _Mein_Script_;
    }
    catch (error) {
      _Resourcen_frei_geben;
      _Fehlermeldung_schreiben;
    }
    //- Dateiende, Kein Script mehr da

    Wenn du dabei noch schreibend auf die DB zugreifst, so solltest du mit Transaktionen arbeiten bzw. diese einleiten, damit du im Fehlerfall diese wieder Rückgängig machen kannst (siehe Connection Objekt, BeginTrans, CommitTrans, RollbackTrans);

    hth
    thorsten