Stefan Schubert: (VBScrpit)

Gesundes Neues liebe Forumer!

Ich habe ein paar grundlegende Fragen zu ASP. Ich moechte damit eine Datenbank anbinden auf die dann innerhalb von ca. 14 Tagen schaetzungsweise 600 Leute zugreifen werden. Daher wuesste ich ganz gerne ein paar grundlegende Dinge die man beachten muss um Fehler zu vermeiden. So zum Bsp.:
* sollte man ein Timeout fuer den DB-Zugriff einbauen

* ist eine Verbindung zur DB offen, muss man diese
expliziet schliessen, oder werden offene Verbindungen automatisch geschlossen?

* was passiert wenn mehrere gleichzeitig in die DB schreiben wollen, fnuktioniert das nur beim ersten und bei den anderen gibt's 'ne Fehlermeldung?

* mussen RecordSet (RS) wieder geschlossen werden? Waas passiert wenn man dies nicht tut?

* ich fand in einem BSP zum oeffnen eines RS folgendes: SQL_Anweisung, conn, 3, 3 --> wofuer stehen die beiden Dreien?

* ich wollte nur Variablen in VBS benutzen, die ich auch vorher definiert hatte, aber bei "Option Explicit" ersheint bei mir nur die Fehlermeldung:"Anweisung erwartet"

* ich brauche einen Browseruebergreifenden Befehl/Tag um vom Benutzer eingegebene Sonder-und Leerzeichen korrekt in die DB zu schreiben --> Versuche mit enctype="text/plain" blieben irgendwie erfolglos

Ich bedanke mich jetzt schon mal fuer Eure Hilfe!
Stefan S.

  1. hallo stefan

    kurz ein paar antworten, zu dem was ich weiss:

    * sollte man ein Timeout fuer den DB-Zugriff einbauen

    * ist eine Verbindung zur DB offen, muss man diese
    expliziet schliessen, oder werden offene Verbindungen automatisch geschlossen?

    wird automatisch geschlossen

    * was passiert wenn mehrere gleichzeitig in die DB schreiben wollen, fnuktioniert das nur beim ersten und bei den anderen gibt's 'ne Fehlermeldung?

    es können mehrere benutzer gleichzeitig schreiben

    * mussen RecordSet (RS) wieder geschlossen werden? Waas passiert wenn man dies nicht tut?

    wird automatisch geschlossen, aber sicher ist sicher, schliesse sie doch, wenn Du sie
    nicht mehr brauchst

    * ich fand in einem BSP zum oeffnen eines RS folgendes: SQL_Anweisung, conn, 3, 3 --> wofuer stehen die beiden Dreien?

    normalerweise ist es folgendermassen aufgebaut:
    Recordset_bla.Open QUERY , ACTIVE_CONECTION , CursorType , LockType , Options
    wobei die letzten drei optional sind

    * ich brauche einen Browseruebergreifenden Befehl/Tag um vom Benutzer eingegebene Sonder-und Leerzeichen korrekt in die DB zu schreiben --> Versuche mit enctype="text/plain" blieben irgendwie erfolglos

    benutze doch die replace-funktion in vbscript, da kannst Du genau definieren, wo, was mit was
    ersetzt werden soll...bsp: FIELD_MEMO = Replace(Request("FIELD_MEMO"), "'", "''") , hier
    ersetze ich die ' durch "

    gruss domi, ich hoffe ich konnte Dir ein wenig helfen...

  2. * ist eine Verbindung zur DB offen, muss man diese
    explizit schliessen, oder werden offene Verbindungen automatisch geschlossen?

    Wenn die Datenbank etwas taugt, dann wird sie solche Verbindungen ins Nirwana nicht als Leichen herumliegen lassen.

    * was passiert wenn mehrere gleichzeitig in die DB schreiben wollen, fnuktioniert das nur beim ersten und bei den anderen gibt's 'ne Fehlermeldung?

    Das ist eine ziemlich komplexe Problematik - um sie vollständig zu behandeln, mußtest Du bei einer richtigen Datenbank das Transaktionskonzept verinnerlicht haben. Deshalb nur in grober Näherung:

    In den meisten Fällen wird eine Änderung am Inhalt einer Datenbank nur eine lokale Sperre dieses Inhaltes verursachen, d. h. die meisten parallelen Prozesse werden einander gegenseitig nicht wahrnehmen.
    Sollten mehrere Prozesse allerdings *dasselbe* Element gleichzeitig ändern wollen, dann werden sie das merken - wahrscheinlich alle bis auf einen. In diesem Falle wäre eine Fehlerbehandlung erforderlich. (Beispiel: Zwei Prozesse fügen "parallel" Datensätze mit identischen Primärschlüsseln ein.)

    Allgemein gesagt: Immer dann, wenn die Integrität der Daten auf dem Spiel steht, wird normalerweise eher ein Fehler generiert, als daß zwei Prozesse sich gegenseitig unbemerkt ihre Ergebnisse überschreiben.
    Es ist allerdings ein Qualitätsmerkmal einer guten Datenbank, solche Mechanismen in vielen Ausprägungen zur Verfügung zu stellen - SQL ist leider nicht gleich SQL.

    Nichts von meinem Beitrag hat mit ASP zu tun.

  3. Hallo Stefan

    * sollte man ein Timeout fuer den DB-Zugriff einbauen

    Du hast in ASP standardmäßig ein Timeout für die komplette Scriptverarbeitung:
    Server.ScriptTimeOut = 30 bedeutet, daß Scripte innerhalb von 30 Sekunden abgeschlossen sein müssen. Ansonsten gibt der Server eine entsprechende Fehlermeldung aus.

    * ist eine Verbindung zur DB offen, muss man diese
    expliziet schliessen, oder werden offene Verbindungen automatisch geschlossen?

    ASP schließt Verbindungen automatisch. Allerdings sollte man das nicht immer voraussetzten, da ASP die Objekte, die für die Connection benutzt werden, nicht immer zerstört.
    Also am besten folgende Vorgehensweise immer einhalten:
    <%
    Set objConn = Server.CreateObject("ADODB.Connection")
        objConn.Open DSN, User, PWD
        ...
        objConn.Close
    Set objConn = Nothing
    %>

    Besonders mit MDAC 2.x kann es einem sonst passieren, daß auf einmal 50 oder mehr Verbindungen gleichzeitig geöffnet werden (!!! von einem Client)

    * was passiert wenn mehrere gleichzeitig in die DB schreiben wollen, funktioniert das nur beim ersten und bei den anderen gibt's 'ne Fehlermeldung?

    Eine gute DB sollte das handeln können und entsprechend die Daten des ersten Users schreiben, dann die vom zweiten, ...  Slebst bei Massentests (auch mit Access) habe ich noch keine Probleme gehabt. Wenn Du es ganz genau wissen willst, kannst Du vor dem Schreibvorgang "Application.Lock" und danach aber auch auf jeden Fall "Application.Unlock" setzen.

    * mussen RecordSet (RS) wieder geschlossen werden? Waas passiert wenn man dies nicht tut?

    MDAC 1.5 handelte das eigentlich ganz gut. Bei jedem Verweis auf dasselbe Objekt (Neue Instanz mit Server.CreateObject("ADODB.Recordset")) wurde einfach ein Zeiger auf das Original-Objekt gesetzt. Da MDAC 2.x hierfür jedesmal ein neues Objekt erstellt, ist bei ca 50 Durchläufen (evtl. Schleife) die Performance merkbar im Keller.
    Auch hier gilt dasselbe wie bei der Connection.
    <%
    Set objRS = Server.CreateObject("ADODB.Recordset")
        objRS.Open SQL, objConn, 3, 3
        ...
        objRS.Close
    Set objRS = Nothing
    %>

    * ich brauche einen Browseruebergreifenden Befehl/Tag um vom Benutzer eingegebene Sonder-und Leerzeichen korrekt in die DB zu schreiben --> Versuche mit enctype="text/plain" blieben irgendwie erfolglos

    Probier doch mal: Server.HTMLEncode(Text) oder Server.URLEncode(Text)
    Wenn das nichts hilft, bleibt Dir nur der Weg über eine eigene Funktion:
    <%
    Private Function ConvertText(GivenText)

    NewText = GivenText
    NewText = Replace(NewText, "ä", "ä")
    ...
    ConvertText = NewText

    End Function
    %>

    Ich bedanke mich jetzt schon mal fuer Eure Hilfe!
    Stefan S.