Using end using

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

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Using end using

    Moin moin

    Habe da ein Problem bei dem ich nicht weiter komme.
    Also mein code läuft beim ersten Aufruf ohne Fehler durch.

    Klicken ich nun erneut auf den Button zeigt sich ein Verhalten was ich nicht verstehe.

    Hier wird dann aus

    Quellcode

    1. klass.restorepath = klass.restorepath & FileName
    plötzlich

    Quellcode

    1. klass.restorepath = klass.restorepath & FileName & FileName


    Also der Filename wird nicht "zerstört". Ich dachte in dem Using Block werden die Variablen dann "zerstört"?


    Spoiler anzeigen

    Der openfileDialog

    VB.NET-Quellcode

    1. Private Sub btn_restore_Click(sender As Object, e As EventArgs) Handles btn_restore.Click
    2. Using OpenFileDialog As New OpenFileDialog
    3. OpenFileDialog.InitialDirectory = "C:\Devlop\Backup\"
    4. OpenFileDialog.Filter = "All|*.bak"
    5. OpenFileDialog.ShowDialog(Me)
    6. Dim FileFullName As String = OpenFileDialog.FileName
    7. Dim result1 As Boolean = String.IsNullOrWhiteSpace(FileFullName)
    8. If result1 = True Then
    9. klass.efehler("default")
    10. Else
    11. Dim FileName As String
    12. FileName = My.Computer.FileSystem.GetName(FileFullName)
    13. FileName = My.Computer.FileSystem.GetName(FileName)
    14. klass.sourcephath = FileFullName
    15. FileName = FileName.Remove(FileName.Length - 22, 22)
    16. tb_sourcephath.Text = klass.sourcephath
    17. tb_targetpath.Text = klass.restorepath & FileName
    18. klass.restorepath = klass.restorepath & FileName
    19. klass.ID = 2
    20. btn_start.Visible = True
    21. btn_start.Text = "Restore starten" <==== Da gehts dann zum kopieren der Datei
    22. End If
    23. End Using
    24. End Sub


    Der Kopiervorgang

    VB.NET-Quellcode

    1. Public Sub do_restore()
    2. Const message As String = "Aktion Restore wirklich ausführen?" & vbCrLf & "Die alte Datei wird überschrieben!"
    3. Const caption As String = "Aktion wird abgebrochen."
    4. If MessageBox.Show(message, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
    5. Try
    6. 'My.Computer.FileSystem.CopyFile(dbsource, dbrestore, overwrite:=True)
    7. efehler("restoreok")
    8. Catch ex As Exception
    9. MessageBox.Show(ex.Message)
    10. End Try
    11. Else
    12. efehler("cancel")
    13. End If
    14. End Sub




    *Topic verschoben*
    Bilder
    • fehler1.jpg

      51,69 kB, 481×231, 25 mal angesehen
    • fehler2.jpg

      55,58 kB, 497×216, 24 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Amelie Poste einen Code, der
    • compiliert und
    • Deinen Effekt reproduziert.
    Überzeuge Dich an einem neuem Projekt davon, dass beide Bedingungen erfüllt sind.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Amelie In deinem Using-Block werden Variablen zerstört? Wäh?
    Dein OFD wird beseitigt, doch nicht deine Buttons und Klassen.

    Du machst die krude Zuweisung doch selbst in der Zeile 22. (du nimmst den Wert von klass.restorepath, packst Filename drann und weist das ganze dann wieder an klass.restorepath zurück).
    Using OpenFileDialog As New OpenFileDialog

    Using's nehmen dir die arbeit ab .Dispose() aufzurufen

    VB.NET-Quellcode

    1. Dim OpenFileDialog diag = New OpenFileDialog() ´ bin kein vb experte, aber das sollte so klappen
    2. ` [...]
    3. diag.Dispose();
    Da hängt nicht mit using zusammen, im ersten Aufruf ist klass.restorepath wohl leer, beim zweiten Aufruf hat die Variable einen Wert und du fügst einfach nur den "Dateinamen" hin an (Zeile 20 & 22).
    @Amelie Was muss ich tun, um Deinen Effekt zu reproduzieren?
    Diese Zeile knallt bei mir:

    VB.NET-Quellcode

    1. FileName = FileName.Remove(FileName.Length - 22, 22)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Amelie schrieb:

    Also muss mich mir da eine weitere Variable erstellen oder?
    Nein.
    Setz einen Haltepunkt darauf und sieh Dir die Variable an. Löse es selber, das geht ganz fix:
    Debuggen, Fehler finden und beseitigen
    Und:
    Wenn Du aus backupname eine Property machst, bekommt die Datei den richtigen Zeitstempel:

    VB.NET-Quellcode

    1. Public ReadOnly Property backupname As String
    2. Get
    3. Return "[" & Now.ToString("dd.MM.yyyy HH-mm") & "].bak"
    4. End Get
    5. End Property
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nochmal ganz von vorne.....
    Also mein code läuft beim ersten Aufruf ohne Fehler durch.

    Wie @slice im Beitrag 6 schreibt wird klass.restorepath zu diesem Zeitpunkt leer String.Empty sein.

    Klicken ich nun erneut auf den Button zeigt sich ein Verhalten was ich nicht verstehe.
    Hier wird dann aus

    Quellcode

    1. klass.restorepath = klass.restorepath & FileName

    plötzlich

    Quellcode

    1. klass.restorepath = klass.restorepath & FileName & FileName


    Also der Filename wird nicht "zerstört". Ich dachte in dem Using Block werden die Variablen dann "zerstört"?


    Mehrere Annahmen sind falsch. Plötzlich passiert das nicht, sondern im 2. Aufruf. Und in jedem Weiteren auch, weil sie der Wert von klass.restorepath immer mehr verlängert.
    Filename wird nicht zerstört, es muss auch gar nicht zuerstört werden, denn es wurde im Using-Block definiert, also gilt es auch nur hier. Zudem ist die Variable sogar unschuldig am unerwünschten Verhalten.
    Du musst unbedingt lernen deinen Code zu debuggen, also Haltepunkt setzen und schauen welchen Wert welche Variable oder Property hat.
    klass.restorepath hat nach dem ersten Durchlauf den Wert D:\Database\MyDataBase.mdb (das hab ich jetzt so festgelegt, ist bei dir aber nicht erkennbar).
    Jetzt kommt der 2. durchlauf und dann "sagt" dein Code: lass klass.restorepath doch seinen Wert annehmen (also das was da schon steht UND noch den Wert von der Variablen, die in FileName steht hinten anhängen. Damit verlängerst du bei jedem weiteren Durchlauf das, was in klass.restorepath zurückgeschrieben wird.

    Wenn Du nur klass.restorepath = FileName haben willst, dann musst du das auch coden.
    @Dksksm
    Danke für deine Ausführung.
    Ich setze mir schon Haltepunkte oder lasse mir an bestimmen Stellen immer mal etwas mit einer MSGBox ausgeben.
    Wie ich jetzt feststellte ist das mit so einer MSGBox wohl nicht immer hilfreich.

    @RodFromGermany
    Ich denke ich habe es nun hinbekommen. Aber eine Frage habe ich.

    VB.NET-Quellcode

    1. ​Public ReadOnly Property
    was ist da nun an dem Zeitstempel anders als bei

    VB.NET-Quellcode

    1. Public backupname As String = "[" & Now.ToString("dd.MM.yyyy HH-mm") & "].bak"


    Achja Danke an alle die hier mit geschrieben haben.

    Amelie schrieb:

    was ist da nun an dem Zeitstempel anders als bei
    Da wird .Now nur bei Start des Programms aufgerufen.
    Als Property bekommst Du die Zeit des Aufrufes.
    Probiere es aus!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    ​was ist da nun an dem Zeitstempel anders als bei


    So komme nun endlich zum antworten. Habe deine Verbesserung mit dem Zeitstempel nun mal ausgiebig getestet und einen gar nicht mal üblen Nebeneffekt festgestellt.
    Wenn man nicht Überschreiben einstellt, kann man nur in jeder neuen Minute ein "BackUp" der Datei machen. ;)

    Amelie schrieb:

    kann man nur in jeder neuen Minute ein "BackUp" der Datei machen.
    Dann musst Du den Zeitstempel um die Sekunden erweitern:

    VB.NET-Quellcode

    1. Public backupname As String = "[" & Now.ToString("dd.MM.yyyy HH-mm-ss") & "].bak"
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!