Diverse Fragen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Diverse Fragen

    Hallo Zusammen, :thumbup:

    ich möchte gleich zu Beginn sagen, dass ich zwar Erfahrung in der Softwareentwicklung habe, allerdings neu in VB.net und Visual Studio 2017 unterwegs bin.
    Man möge mir also eventuell die ein oder andere "dumme" Frage verzeihen, falls die für euch auf der Hand liegen sollte. ;)

    Ich habe in letzter Zeit sehr viel mit VB getestet und testweise "gearbeitet" und dabei sind mir ein paar Sachen aufgefallen, die ich für mich bisher nicht sauber gelöst bekomme. Deswegen ziehe ich euch mal zu Rate ;)

    1. MySQL Connection
    Es ist ja hier zu einer MySQL Datenbank pro Connection nur eine Abfrage gleichzeitig möglich. Ich werde später in meinem Programm die Situation haben, dass ich eine Abfrage in der Datenbanktabelle A mache, in dieser Abfrage 2 Werte multipliziere und diesen Wert auf eine Gültigkeit in Tabelle B prüfe. Ich habe hier also keine ID Zuordnung über die ich einen Join machen könnte. Ich weiß wie ich das Problem lösen kann, das soll jetzt hier nicht die Frage sein...

    Die Frage an euch ist eher: Wie handhabt ihr die Situation, wenn ihr mehrere Abfragen ausführen müsst?
    Baut ihr für jede Abfrage eine neue Connection zur Datenbank auf und schließt diese dann wieder oder habt ihr andere Techniken auf Lager?

    Das wäre für mich eine neue und ungewohnte Arbeitsweise. Bisher wurde beim Programmstart eine Connection aufgebaut, die bei Programmende geschlossen wurde. Das funktioniert so aber nicht, weil wenn es mal vergessen wird, die Connection zu schließen, geht gar keine Abfrage mehr durch. :rolleyes:

    Was haltet ihr von der Idee jeder Form die erstellt wird eine eigene Connection zur Verfügung zu stellen und diese beim Schließen der Form auch zu schließen?
    Ich würde mir zum Einen davon erhoffen, dass ich bei mehreren geöffneten Formen die Abfragen getrennt steuern kann und zum Anderen wäre das auch ein Stück Sicherheitsmechanismus, dass falls ich mal vergessen sollte eine Connection zu schließen nicht das ganze Programm lahm gelegt ist (zB wenn ich nur bei Programmstart eine Connection aufbaue und diese beim Beenden schließe).

    Das Programm wird ein reines Datenbankprogramm. Deswegen wäre es meiner Meinung nach "unnötig" für wirklich JEDE neue Abfrage eine neue Connection aufzubauen.

    2. Ordnerstruktur [BEREITS ERLEDIGT]
    Gibt es in Visual Basic die Möglichkeit, auf Klassen außerhalb des Projektordners zuzugreifen?

    Ich hätte gerne eine Orderstruktur wie:

    VB_PRJ (Ordner, indem alle Projekte mit VB liegen werden)
    - GLOBAL_CLASS (Klassen, die in allen möglichen VB-Projekten genutzt werden)
    - PRJ_CLASS (Klassen für einzelne Projekte)
    - - Mein_Projekt (Klassen für speziell dieses Projekt)
    - Mein_Projekt (Eigentlicher Projektordner)

    Hintergrund der Geschichte ist, dass es zu diesem Programm noch Jobs geben wird.
    Diese Jobs sollen zum Teil auf Klassen zugreifen können, die ich zur Steuerung für diese Jobs auch benötige (zB Verschlüsselung...). Wenn ich allerdings zurzeit die Klassen in GLOBAL_CLASS ablege und in VS öffne, werden diese Klassen in den Projektordner (Mein_Projekt) kopiert.
    Kann ich das irgendwie umstellen oder muss ich diese dann in ein getrenntes Projekt schieben und eine DLL daraus basteln, die geladen wird?

    Ich möchten nur nicht die gleichen Klassen mit den gleichen Funktionalitäten zig mal verwalten müssen... Warum versteht ihr bestimmt. ;)

    EDIT:
    3. Form über Namen ansprechen [BEREITS ERLEDIGT]
    Wenn ich von der Klasse einer Form zum Beispiel 3 Objekte anlege, also 3 mal die Windowsform öffne, kann ich diese dann mit einem Namen ansprechen, wenn ich diesen vorher vergeben habe?

    Ich habe zum Beispiel in einem Menü folgenden Code:

    VB.NET-Quellcode

    1. Private Sub NewFormStripMenuItem_Click(sender As Object, e As EventArgs) Handles BTN_NewForm.Click
    2. Dim mForm As New Form1
    3. mForm.MdiParent = Me
    4. mForm.Show()
    5. End Sub


    Me ist in dem Fall mein Main-Fenster

    Klicke ich mehrmals auf den Button, öffnet dieser mehrmals die Form -was in Zukunft auch so gewollt ist. Keine Sorge, es wird eine Begrenzung geben :P

    Beim Start der Form wird folgender Code ausgeführt:

    VB.NET-Quellcode

    1. Dim rCode As Integer = false
    2. Dim i As Integer
    3. i = 0
    4. While rCode = false
    5. If Not MeinArray(5, i) > 0 Then
    6. MeinArray(5, i) = 1
    7. wAlias = cForm.Name & "_" & i
    8. If i > 0 Then
    9. cForm.Text = cForm.Text & "_" & (i)
    10. End If
    11. cForm.name = wAlias
    12. cNr = i
    13. rCode = 3 'erledigt
    14. End If
    15. i = i + 1
    16. End While

    Dieser Code schaut in einem Array ("MeinArray") nach, ob und wie oft das Fenster bereits geöffnet ist.
    Dann wird für den nächsten freien Platz der Name zum Beispiel in "Form1_7" geändert, falls das Fenster bereits 6 mal geöffnet war.
    Diesen Namen habe ich auch in dem String "wAlias" gespeichert.

    Zur Info:
    Die 5 in "MeinArray" ist fest für diese Form in einer konstanten hinterlegt.
    cForm ist die Referenz auf die soeben erstellte Form. Der Name wird auch übernommen und im Debugger angezeigt. Das geht.

    Gibt es nun eine Möglichkeit, dass ich sagen kann:

    VB.NET-Quellcode

    1. Private Sub NewFormStripMenuItem_Click(sender As Object, e As EventArgs) Handles BTN_NewForm.Click
    2. Dim mForm As New Form1
    3. mForm.SetFocus(wAlias) 'Ich weiß, das funktioniert nicht ;)
    4. 'Da sollte etwas stehen wie mForm.SetFocus("Form1_7")
    5. End Sub

    ...und er weiß nun, welche Form den Fokus bekommen soll?
    --> Zu dem Zeitpunkt zu dem ich diesen Code benötige, ist das Fenster zwar geöffnet, aber außer dem "wAlias" und dem Namen hätte ich das Objekt nicht im Zugriff. Falls dies nicht möglich ist, müsste ich mir noch die Referenz merken :D

    ==> Das ist zurzeit nur ein Experiment.


    So, das war es mal fürs Erste. Ich stöbere dann mal noch etwas durch diverse Foren und teste noch ein paar Dinge.
    Es werden bestimmt noch ein paar Fragen folgen. :saint:

    Vielen Dank aber schon mal für eure Hilfe. :thumbsup:

    Lg

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „LassMichInRuhe“ ()

    Perfekt, genau das was ich gesucht habe. Danke!

    Der Code mit dem es funktioniert:

    VB.NET-Quellcode

    1. Dim frmCollection = System.Windows.Forms.Application.OpenForms
    2. If frmCollection.OfType(Of Form1).Any Then
    3. frmCollection.Item("Form1_3").Activate()
    4. End If

    ...wobei das "_3" logischerweise für den "Index" steht und nachher variabel ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LassMichInRuhe“ ()

    Zu deinem 2. Problem kannst du meines Wissens nach Projekte verwenden.. erstell für deine Bibliotheken bzw. "Klassen" eigene Projekte.. diese kannst du dann in deine Projektmappen einbinden und wenn die Bibliotheken an einem Ort geändert werden, tun sie das auch in anderen Projektmappen.
    Bin mir diesbezüglich aber nicht sicher, korrigiert mich also gern, falls hier irgendwer besser Bescheid weiß. Hab das schon länger nicht mehr wirklich verwendet

    Grüße
    Grüße
    Felix
    zu 1.:

    Das Problem ist, dass du DataReader usw. schließen (noch besser mithilfe von Using disposen) musst, bevor du neue Abfragen starten kannst. Daher ist es vonnöten, wenn du Daten mit DataReadern abfragst, dass du die Daten zunächst in eine andere Form bringst, und dann so früh wie möglich den Reader eben schließt/disposest, und dann erst deine Berechnungen fortführst.

    Befehle wie UPDATE oder DELETE hingegen können in schneller Reihenfolge durchgeführt werden, sollten jedoch immer in einer Transaktion laufen, falls etwas schief geht. So kann man immer einen Rollback ausführen.

    Wenn es sich jedoch hauptsächlich um eine Anwendung handelt mit der du ziemlich direkt die Tabellen manipulierst, solltest du dir Databinding mal genauer ansehen, da du dir damit SEHR VIEL Code sparst, den du sonst selbst schreiben müsstest. Auch wichtig dafür ist ein typisiertes Dataset.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    Kenaex schrieb:

    Zu deinem 2. Problem kannst du meines Wissens nach Projekte verwenden..
    ...


    Vielen Dank für den Hinweis. Habe mir das jetzt mal angeschaut und das funktioniert.

    Ich habe es jetzt folgendermaßen gelöst:

    1. Erstellung einer leeren Projektmappe über:
    Datei >> Neues Projekt >> Installiert >> Andere Projekttypen >> Visual Studio-Projektmappen >> Leere Projektmappe

    2. Anlage von 2 Testprojekten in dieser Projektmappe
    - Im Projektexplorer: Rechte Maustaste auf Projektmappe >> Hinzufügen >> Neues Projekt >> Windows Forms-App (als "Projekt1")
    - über Datei >> Hinzufügen >> Neues Projekt >> Klassenbibliothek (als "Projekt2")

    3. Im Projektexplorer rechtsklick auf "Projekt1" >> als Startprojekt festlegen
    (es gehen auch mehrere, wenn man mit der rechten Maustaste auf die Projektmappe klickt und die Eigenschaften aufruft)

    VB.NET-Quellcode

    1. '4. Im Projektexplorer rechtsklick auf die Projektmappe >> Eigenschaften >> Projektabhängigkeiten
    2. '>>> bei "Projekte" "Projekt1" auswählen und das Häkchen bei "Abhängigkeiten" (von) "Projekt2" setzen
    3. '>>>Dadurch wird das "Projekt2" vor dem "Projekt1" kompiliert und die nötige DLL automatisch erzeugt.
    4. Wird auch über die Verweise (Punkt 5) automatisch geregelt



    5. Im Projektexplorer rechtsklick auf "Projekt1" >> Hinzufügen >> Verweis >> Projekte >> Das Häkchen bei "Projekt2" setzen

    6. In "Projekt1" in der Form1 einen Testbutton angelegt:


    VB.NET-Quellcode

    1. Imports Projekt2
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim cl As New Class1
    5. cl.tausgabe()
    6. End Sub
    7. End Class



    Meine Klasse in Projekt2 sieht folgendermaßen aus:

    VB.NET-Quellcode

    1. Public Class Class1
    2. Public Sub tausgabe()
    3. Debug.Print("test")
    4. End Sub
    5. End Class


    Es sind dann zwar Projekte, und nicht nur eine "logische" Trennung der Sourcen, aber das ist in Ordnung. Kommt im Endeffekt auf das gleiche heraus und ich kann mir sogar bequem DLLs daraus erstellen ;)

    @EaranMaleasi Danke für die Hinweise. das werde ich mir mal genauer anschauen :thumbup:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „LassMichInRuhe“ ()

    Normalerweise legt man direkt ein entsprechendes Projekt an (in diesem Fall Winows Forms App), und fügt dann der von VS erstellten Projektmappe per Rechtsklick auf selbige, weitere Projekte hinzu. Über die Verweise wird völlig automatisch geregelt, welches Projekt von welchem abhängig ist, und wann welches erstellt wird. Da brauchst du nichts von Hand machen. Und Per Rechtsklick auf ein Projekt kannst du dieses auch als Startprojekt festlegen.
    Ok, das mit den Verweisen wusste ich nicht. Das macht es dann etwas einfacher ;)

    Den Weg über die leere Arbeitsmappe habe ich bei der Auflistung mit Absicht gewählt, damit der Unterschied zwischen der Projektmappe und dem eigentlichen Projekt etwas zum Vorschein kommt.
    Ich hatte auch bereits gelesen, dass für jedes Projekt eine Solution/Projektmappe angelegt wird, auch wenn nur ein Projekt enthalten ist. Das war mir bisher nie aufgefallen und ich denke, dass das Anderen evtl auch so geht ;)
    @LassMichInRuhe Bitte in Zukunft pro Frage einen einzelnen Thread aufmachen, das ist auch in deinem eigenen Interesse. Dann natürlich jeweils einen aussagekräftigen Titel festlegen!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum