Announcement

Collapse
No announcement yet.

Formularstart mit LogIn und Splash

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

  • Formularstart mit LogIn und Splash

    Hallo zusammen

    ich bin erst seit kurzem hier in dem Forum unterwegs. Bisher habe ich mit Access und VBA gearbeitet. Nun möchte ich gerne die Daten via Oracle und VB.Net zur Verfügung stellen. Meine letzte Erfahrungen mit VB.Net waren vor 3 Jahren durch ein Fernstudium, seitdemher wie erwähnt nur wieder Access und VBA. Viel Lektüre zum lesen habe ich neben mir stehen, aber dort genauso wie im Netz finde ich nicht die richtige Hilfe. Ich hoffe ihr könnt mir weiterhelfen.

    Ich nutze VB.Net 2005 (Englisch).

    Ich habe ...
    frmLogIn
    frmMain (Hauptmenü/Hauptauswahl)
    frmSplash

    clsMain
    Code:
    Imports Microsoft.VisualBasic
    Imports System.Windows.Forms
    Imports System.Console
    Imports System.Drawing
    Imports System.Threading
    
    Public Class Program
        Public Shared Sub Main()
            Application.EnableVisualStyles()
            Dim frmSplash As New frmSplash
            Dim frmLogin As New frmLogIn
            frmSplash.Show()
            Application.DoEvents()
            Try
                conn.Open()
                For i As Integer = 0 To 100
                    ' Initialisierungsarbeiten  
                    frmSplash.Label1.Text = "Initialisierung: ... " & i
                    frmSplash.Label1.Refresh()
                    ' throw-Anweisung dient nur zum Testen  
                    ' throw new Exception();  
                    Thread.Sleep(50)
                Next
            Catch
                MessageBox.Show("Beim Starten ist ein Fehler aufgetreten.", _
                Application.ProductName, MessageBoxButtons.OK, _
                MessageBoxIcon.Error)
                Application.Exit()
                End
            End Try
            frmSplash.Close()
            frmLogIn.Show()
            Application.Run()
        End Sub
    End Class

    mdlConnection (Verbdingungseinstellungen zum Oracle Server)
    Code:
    Module mdlConnection
    
        'Oracle Server Adresse setzen
        Private Const oradb As String = "Data Source = (DESCRIPTION =" _
        + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = P0038442) (PORT = 1521)))" _
        + "(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE )));" _
        + "User ID = Aktiv; Password = Aktiv;"
    
        Public conn As New OracleConnection(oradb)
    End Module
    Nun wollte ich gerne das nach dem Öffnen des Tools/Programms das Splash erscheint. Dies macht es auch. dadurch das aber das Öffnen der Verbidung zum Oracle Server einige Sekunden dauert, wollte ich dies mit einer Initialisierung in dem Splash darstellen. Leider öffnet er erst die verbindung und simuliert dann die Initialisierung. Wenn ich aber conn.open() in der For Next Schleife setze, dann kommt es zu einem Fehler.

    Im Anschluß öffnet er das LogIn Fenster, das ist auch o.k. allerdings soll dann wenn O.K. geklickt wurde und das Kennwort überprüft wurde, das LogIn Fenster geschlossen und das frmMain Fenster geöffnet werden.

    Ich habe zwar schon was gelesen zum Thema "Anwendungen mit meheren Fenstern", aber irgendwie kann ich das nicht nachvollziehen.

    Als Applicationstyp habe ich "Windows Service" gewählt, nur so hatte ich auch die Möglichkeit das Startobject als Sub Main zu setzen. Ist das so korrekt?

    Ich hoffe auf eure Hilfe

    LG Marja

  • #2
    Hallo,

    leider habe ich im Moment keine Zeit, um ausführlich zu antworten. Deshalb kann ich erst einmal nur ein paar Stichworte geben.

    1. Kapsle sowohl SplashForm als auch LoginForm in Using-Blöcke, damit sie nach Erledigung aufgelöst werden.

    2. LoginForm empfiehlt sich per ShowDialog; nach DialogResult.OK wird ein Rückgabewert gesetzt.

    3. Wenn Login gleich OK, dann erstelle das Hauptformular mit aller Initialisierung (von Main aus).

    4. Erst danach wird Splash geschlossen und das fertige Hauptformular per Application.Run(main) aktiviert.

    5. Die DbConnection sollte nicht während der Laufzeit offenbleiben. Sie wird immer nur bei Bedarf geöffnet und anschließend geschlossen und aufgelöst (Dispose). Auch dafür ist ein Using-Block zu empfehlen. Siehe z.B. [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen.

    6. Für den Arbeitsfortschritt im SplashForm bietet sich ein Delegate an, der z.B. an das MainForm übergeben wird und von dort aus Informationen an das SplashForm weiterleitet.

    Tut mir leid, wenn ich dir jetzt so viele Hinweise vor die Füße werfen musste, aber ich muss gleich wieder weg. Jürgen

    Comment


    • #3
      Du willst etwas während dem conn.Open() tun. Heißt gleichzeitig. Gleichzeitigkeit bekommst du eigentlich nur mit asynchronem Verhalten also über Threads und Konsorten. Denn der Hauptthread steht während dem Aufruf von conn.Open(). Im Hauptthread kann also gleichzeitig nichts anderes passieren.

      Es geht die aber parallel doch nur darum den Zähler der Anzeige im Splash hoch zusetzen oder? Ist das notwendig? Da du im voraus nicht wissen kannst wie lange das öffnen dauert hilft dir der doch nicht. Dein jetziger Code zeigt denn ja auch nur einfach für ca. 5 Sekunden an unabhängig davon wie lange das öffnen der Connection wirklich gedauert hat.

      Pragmatisch würde ich sagen einfach Splash anzeigen ohne Zähler, Connection öffnen und dann wieder Splash ausblenden klassischer knapper 3-Zeiler. Wenn du mehr willst wirst du dich wohl mit Threads auseinander setzen müssen.

      P.S. Der Aufruf von Application.DoEvents() ist glaube ich überflüssig. DoEvents arbeite ja vorhandene Events ab. Die Eventschleife in der diese Events stecken wird aber erst durch den Aufruf von Application.Run() erzeugt und gestartet. Es kann also zu dem Zeitpunkt an dem du Application.DoEvents() aufrufst noch gar keine abzuarbeitenden Events geben.

      P.S.S. Die Connection im Vorfeld zu öffnen (und dauerhaft offen zu halten?) finde ich merkwürdig. Man sollte Connections dann öffnen wenn man sie braucht und dann sofort schließen. Ich vermute auch die OracleConnection(und der Treiber dahinter) beherrschen Connection Pooling so das jedes weitere öffnen quasi Instantan statt findet.

      Comment


      • #4
        @Ralf Jansen
        Hmm, ich hatte vom einem Programmierer (ein Bekannter von mir) gehört, das ich die Verbindung zu Beginn öffnen sollte um beim Beenden des Programmes schließen sollte. Ich habe bisher mit Oracle Datenbanken nicht viel zu tun gehabt. Ich habe den "alten" VB.Net Oracle Treiber (System.Data.OracleClient) verwendet. Alt daher, weil mir in dem Forum gesagt wurde, das ich den direkten von Oracle nehmen soll, weil Microsoft ihren eingestellt hat. Ob aber der direkte Oracle Treiber hier im Unternehmen als SoftwareVerteilung zur Verfügung steht weiß ich nicht. Daher weiß ich leider auch nicht ob dieses Pooling unterstützt wird. Ich habe nur gemerkt, wenn ich die Verbindung öffne, das es schon ne kleine Zeit dauert, daher bin ich mir nicht sicher ob es dann vernünftig mit diesem Pooling läuft wie du es schreibst, bzw. kann ich damit noch nicht viel anfangen.

        @Jürgen Thomas
        danke dir für deine Antworten. Das ist schon o.k. für die Infos, auch wenn du sie mir vor die Füße wirfst ;-) Nee ich muß es ja auch lernen und habe mit deinen Antworten sicherlich schon einige gute Anhaltspunkte.

        Danke und LG für die Antworten Marja
        Zuletzt editiert von Jürgen Thomas; 26.02.2010, 14:29. Reason: 2 Beiträge kurz hintereinander ist nicht richtig, ebenso Komplettzitate.

        Comment


        • #5
          Hallo nocheinmal zusammen

          so nach ich langsam wieder einsteige, habe ich eine Frage zu dem vorher genannten Verbindungspooling.

          Habe ich es richtig verstanden, das ich die Verbindung, wenn es notwendig wird öffne mit .open und wenn ich sie nicht mehr brauche mit .close schließe, sie dann aber im Pool liegen bleibt? Erst wenn ich nach . close auch noch .dispose schreibe ist die Verbindung komplett weg?

          Ich habe folgenden Code als geschrieben, das ist doch auch o.k. so oder?
          Code:
          Imports System.Data.OracleClient
          Module mdlConnection
          
              'Oracle Server Adresse setzen
              Private Const oradb As String = "Data Source = (DESCRIPTION =" _
              + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = P000815) (PORT = 1521)))" _
              + "(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE )));" _
              + "User ID = Aktiv; Password = aktiv;"
          
              Public conn As New OracleConnection(oradb)
          
          End Module
          Nun öffne ich ja mit conn.open die entsprechende verbindung, was beim erstmaligen aufruf ja ein bißchen dauert.

          Ich hatte aber irgendwo noch gelesen, das ich das Pooling auf True stzen muß und auch die max. Anzahl an Verbindung angegeben kann. Wie mache ich das im Code und kann ich auch festlegen, wann die Verbindungen aus dem Pool geworfen werden sollen?

          Edit: wäre das so korrekt?
          + "User ID = Aktiv; Password = aktiv;Pooling=true"
          Edit2: Ich habe auch gerade das gelesen:
          Verbindungspooling sollte nicht verwendet werden, wenn "integrated security" in Verwendung ist. Damit würde ein eindeutiger Verbindungsstring für jeden Benutzer erzeugt, und jeder Nutzer hätte einen Verbindungspool, den die anderen nicht benutzen könnten. Das führt zu schlechten Performancewerten. In dieser Konstellation ist von einem Pooling abzuraten
          Woran erkenne ich ob "integrated security" in Verwendung ist?

          Edit3: Also irgendwie verstehe ich das doch noch nicht so mit den Verbindung, sie funktioniert zwar, aber ...

          Ich habe ja zwei PCs hier zu stehen. Auf den einen erstelle cih die Anwendung mit VB.Net auf dem anderen läuft Oracle XE. Nun habe ich meine noch am Anfang befindliche Anwendung gestartet. Er verbindet sich mit der Oracle Datenbak. Die Verbindung sehe ich auch unter den Sessions bei Oracle PC.
          Nun schließe ich nur mit Close die Verbindung ohne Dispose. Schon steht die PC Nummer von der Anwndung zweimal drin. Heißt das dennoch er hat zwei "ruhende" verbindungen? Öffne ich diese wieder mit .open, stehen 3 da, aber im Leerlaufprozess.

          Nun habe ich auch mal mehr als 5 Minuten gewartet und die verbindung zur Laufzwit nochmal gestartet. Das hat leider wieder ca. 25 Sekunden gedauert. Nun finde ich es aber besser das der User später nicht so lange in der Anwendung wartet, wie kann ich das umgehen, das die verbindung schneller zur Verfügung steht. Das ist doch das was mit Pooling zu tun hat oder? Aber das kann ich noch nicht nachvollziehen. Würde mich auf Hilfe freuen von euch.

          LG Marja
          Zuletzt editiert von marja; 01.03.2010, 19:07.

          Comment


          • #6
            Habe ich es richtig verstanden, das ich die Verbindung, wenn es notwendig wird öffne mit .open und wenn ich sie nicht mehr brauche mit .close schließe, sie dann aber im Pool liegen bleibt?
            Soweit korrekt

            Erst wenn ich nach . close auch noch .dispose schreibe ist die Verbindung komplett weg?
            Nein die Verbindung ist weg wenn der Pool diese freigibt und das wird über Einstellungen der Datenbank gesteuert. Die Anwendung hat da keinen Einfluß drauf.

            Ich hatte aber irgendwo noch gelesen, das ich das Pooling auf True stzen muß und auch die max. Anzahl an Verbindung angegeben kann.
            Bei allen DB's die ich kenne ist, wenn von der DB selbst Connection Pooling eingeschaltet ist, Pooling=true der Default. Macht also keinen Sinn das im Connectionstring anzugeben. Es könnte nur Sinn machen bei bestimmten Verbindungen diese vom Pooling auszuschließen (Pooling=false).

            Woran erkenne ich ob "integrated security" in Verwendung ist?
            Keine Ahnung laß mal User/Passwort weg wenn du trotzdem an die Datenbank kommst (dann per Windows Authentifizierung) läuft die integrated security.

            Zu deinem konkreten Problem mit deiner OracleXE Datenbank kann ich dir leider nicht helfen(keine Ahnung von Oracle). Da Pooling ein ein Treiberfeature ist würde ich dir empfehlen das in der Doku zu deinem Datenbank Provider nachzulesen(Welchen du auch auch immer benutzt).

            P.S: Sind 25 Sekunden normal für einen ersten connect bei Oracle? Wenn ja frag ich mich warum das Teil so beliebt ist? Ich würde 25 Sekunden als disqualifizierend für jeden professionellen Einsatz werten.

            Comment


            • #7
              Hallo

              ich danke dir, für deine Antworten

              Keine Ahnung laß mal User/Passwort weg wenn du trotzdem an die Datenbank kommst (dann per Windows Authentifizierung) läuft die integrated security.
              Also wenn ich User und Kennwort leerlasse, dann erfolgt eine Fehlermeldung nach einer kurzen Zeit. Du meinst, es sollte sich dann ggf. eine MsgBox von Windows aufmachen in dem ich dann manuell User und Kennwort eintragen kann?

              P.S: Sind 25 Sekunden normal für einen ersten connect bei Oracle? Wenn ja frag ich mich warum das Teil so beliebt ist? Ich würde 25 Sekunden als disqualifizierend für jeden professionellen Einsatz werten.
              Mal geht es sofort, bsp. habe ich einmal das Tool gestartet, dann dauert die erste Verbindung bis zu 25sek. Wenn ich es schließe und sofort wieder öffne, ist die Verbindung sofort da. Aber da sagtest du ja, das sie noch im pool ist, da die DB den Pool verwaltet.

              Ja, ich wollte erst mit MySQL arbeiten, aber wie erwähnt ein Programmierer (Bekannter von mir) sagte wenn ich schon die Möglichkeit habe, dann sollte ich Oracle nehmen.

              Edit: Nun habe ich es auch mit MySQL probiert, weniger als eine Sekunde und die verbindung stand. Wenn ich aber bei Oracle XE via tnsping die Anfrage starte, dauert es auch nur ca. 30ms bis max. 90ms.

              Wo könnte ich dazu evtl. Hilfe erhalten, hier im VB.Net Forum oder doch eher im Oracle Forum?

              LG Marja
              Zuletzt editiert von marja; 02.03.2010, 12:59.

              Comment


              • #8
                Also wenn ich User und Kennwort leerlasse, dann erfolgt eine Fehlermeldung nach einer kurzen Zeit. Du meinst, es sollte sich dann ggf. eine MsgBox von Windows aufmachen in dem ich dann manuell User und Kennwort eintragen kann?
                Nicht nur leer lassen. Die Teile aus dem Connectionstring ganz weglassen.
                Es sollten dann deine Credentials der Windowsanmeldung automatisch benutzt werden.

                Zumindest der SQL Server (und wenn Oracle integrated Security unterstützt und eingeschaltet ist auch der) kann Windowsuser genauso wie direkt in der Datenbank gepflegte Benutzer verwenden und mit Rechten ausstatten. Geht dann eben transparent ohne weitere Authentifizierung. Man ist ja durch seine Anmeldung an Windows schon authentifiziert.

                Da das jetzt konkrete Oracle Probleme sind würde ich für Details nochmal im Oracle Forum fragen. Die können dir wahrscheinlich eher helfen.

                Comment


                • #9
                  Nicht nur leer lassen. Die Teile aus dem Connectionstring ganz weglassen.
                  Es sollten dann deine Credentials der Windowsanmeldung automatisch benutzt werden.
                  Habe ich nun auskommentiert. Dennoch fragt er mich nicht manuell. Durch die hinterlegte Fehleroutine erfolgt die Meldung, das "beim Starten ein fehler aufgetreten ist". Somit ist die Frage beantwortet, ich danke dir.

                  Bzgl. des oracle Clients habe ich die Frage ebtsprechend weitergereicht in das Oracle Forum. Ich danke dir.

                  Marja

                  Comment

                  Working...
                  X