Announcement

Collapse
No announcement yet.

Clients einer Anwendung begrenzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Clients einer Anwendung begrenzen

    Hallo alle zusammen!

    Ich habe ein kleines Warenwirtschaftsprogramm geschrieben und befinde mich fast in der Endphase.

    Die Anwendung arbeitet mit einer MS SQLExpress 2005 DB.

    In meiner Anwendung habe ich eine rollenbasierte Sicherheit implementiert.

    Beim Start der Anwendung wird ein LoginDialog aufgerufen, mit dem sich der Anwender am System anmelden kann. Das Passwort liegt - natürlich verschlüsselt - in der Anwenungs-DB und wird zusammen mit dem Bediener geprüft. Ist die Prüfung erfolgreich, wird eine Datei eingelesen, in der sich Lizenzdaten - ebenfalls verschlüsselt - befinden und anschließend die MainForm geöffnet.

    NUN DAS EIGENTLICHE PROBLEM:

    Ich habe in der eben genannten Datei neben den Lizenzdaten ebenfalls vor, die maximalen Anmeldungen an Clients zu hinterlegen.

    Beispiel: Kunde kauft Anwendung mit 5 User Lizenzen.

    5 User sind bereits aktiv (sprich die MainForm ist bei allen aufgerufen)
    Sobald sich ein 6. User anmelden möchte, soll gar nicht erst die LoginForm aufgerufen werden sondern eine Messagebox erscheinen mit z.B.: Es sind bereits 5 User angemeldet, Ihre Lizenz erlaubt keine weiteren Anmeldungen. Anschließend wird die Anwendung wieder beendet.

    Das ist soweit auch nicht schwierig,

    Ich stelle mir nur die Frage, wie ich die Prüfung, ob und wie viele User sich im Netzwerk an der Anwenung angemeldet haben, vornehme.
    Meine erste Idee war, dass ich die Anmeldungen bei Aufruf der Anwendung in eine z.B. AktiveUserTabelle der Anwendungs-DB schreibe. Nur was passiert, wenn das Programm oder gar der Rechner abstürzt??? Das Programm wird beendet, OHNE dass der DS aus der DB wieder gelöscht wird.

    Zudem muss ich ja auch sicherstellen, dass die Anwendungs-Datenbank Online ist, wenn ich den DS schreibe. Das heißt auch hierfür muss ich eine Prüfung vornehmen. Somt taucht die nächste Frage auf.

    ---Wie kann ich die Verfügbarkeit einer bestimmten DB im SQLExpress-Server
    ---2005 performanceerhaltend mittels Timer z.B. einmal pro Sekunde
    ---prüfen?

    Das scheint mir somit nicht die beste Lösung. Gibt es hierfür eine Prüfungsroutine die ich nutzen kann oder ähnliches???

    Hat jemand von Euch eine Idee, wie ich dass am besten lösen bzw. implementieren kann???

    Ich danke allen die mir Antworten bereits im Vorraus.

    Euro kleine Anfängerin Laura

  • #2
    Hallo Laura,

    SQL ist zwar nicht mein Steckenpferd, aber trotzdem will versuchen dir eine Antwort auf deine Fragen zu geben.

    Ist der Server erreichbar?
    Im allgemein sollte man alle IO-Operationen mit sogenannten Try ... Catch Anweisungen behandeln, um auftretende Exceptions abzufangen. Wenn du also das Connection.Open ..... Connection.Close in dem Try-Block behandelst, wird dir beim auftreten eines Fehlers eine Exception geworfen, die du nach Auswertung und Aufbereitung dem User darstellen kannst.

    Wie könnte man die Lizenzierung gestallten?
    Also deinen Ansatz mittels AktiveUserTabelle finde ich schon mal richtig gut. Vielleicht noch folgende Gedanken von mir dazu.
    Wenn sich ein User anmeldet überträgt er seinen Namen an die AktiveUser Tabelle. Zu dieser Tabelle baust du dir eine Stored Procedure im SQL Server, welche den Eintrag um den TimeStamp des Eintrags selbst ergänzt. Also die Zeit, wann der DS in die Tabelle eingetragen wird. Dazu ist es aber wichtig, dass man die Zeit des Systems verwendet auf dem der SQL Server läuft. Warum? Dazu gleich mehr.
    Ist der User angemeldet, startest du in deiner Anwendung einen Timer, der in einem gewissen Takt den Eintrag in der AktiveUserTabelle aktualisiert. Hierzu muss nur wieder der TimeStamp des Updates auf den Namen geändert werden. Und wieder muss es sich um die Zeit auf dem SQL-Server handeln!

    Was hat es mit dem TimeStamp auf sich?
    Eigentlich geht es um das automatische Löschen eines Datensatzes aus der AktiveUserTabelle. Hierzu baust du eine 2. Stored Procedure in den Server ein, welche den Timestamp auswertet. Diese Prozedur meldest du als Job im Server an, somit hast du die Möglichkeit das Ganze zeit gesteuert und in Intervallen auszuführen. Die Prozedur muss dann nichts weiter machen, als den Timestamp des Eintrages mit der eigenen Serverzeit zu vergleichen und den User bei Überschreiten eines Zeitlimits zu löschen. So wird sicher gestellt, dass wenn der User seine Anwendung (un)freiwillig schließt, er aus der AktiveUserTabelle gelöscht wird. Da die Systemzeiten aber nicht immer synchron sind, muss eben die Zeit genommen werden, wo der Vergleich stattfindet.

    Beim Starten der Anwendung brauchst du dann nur ein simples Count auf die AktiveUserTabelle und den Abgleich mit deiner Lizenzdatei um die Anzahl der max. möglichen User zu beschränken.

    Die Zeitintervalle sollten man aber mit bedacht wählen, da sie, je nach Umfang der Aufgabe, eine nicht zu unterschätzende Last erzeugen können. 1 sec halte ich für zu kurz.

    Zu Stored Procedures, Trigger und Jobs mach dich mal mit dem Microsoft SQL Server Management Studio Express vertraut. Dort kann man mittels Bausteinen verschiede Sachen einbauen.

    mfg Laptel

    Anmerkung:
    Es könnte sogar möglich sein, das du dir die 1. Prozedure im Server sparen kannst, da beim Eintragen und Update eines DS die Zeit eigentlich mit hinterlegt wird. In welcher Form dies geschieht, dazu müsste man nochmal nachschlagen.

    Comment

    Working...
    X