Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

Îåêßíçóå áðü ôï ìÝëïò Q-apprentice. Τελευταία δημοσίευση από το μέλος Q-apprentice στις 06-05-2010, 10:42. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-05-2010, 10:46 58548

    Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

    Καλημέρα σε όλους. Είχα ρωτήσει πιο παλιά για το πως μπορώ να ελέγχω events κατά την διάρκεια του form closing και επιλύθηκε μια χαρά χάρις την βοήθεια των ανθρώπων εδώ.  Αυτό που αντιμετωπίζω όμως είναι το εξής :

    Όταν κλείνει η φόρμα  τρέχω ένα query το οποίο καταγράφει την έξοδο των χρηστών στην βάση (κάνω το ίδιο και για την είσοδο). Το query, κατά την έξοδο όμως, τρέχει 2 φορές (!) με αποτέλεσμα να έχω διπλή εγγραφή στην βάση για την έξοδο του ίδιου χρήστη.

    το module που έχω φτιάξει για login-logout, είναι το εξής :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Imports System.Windows.Forms
    Imports System.Data.SqlClient
    Module General
        '==================================================================================================
        'Query Εισόδου Χρηστών...
        Public login As String = "INSERT INTO [20_UserLog] " _
                                & "(UserID, FName, LName, Logdate, In_Out)" _
                                & "VALUES " _
                                & "(" & Convert.ToInt32(CentralScreen.UserIDText.Text) & ", " _
                                & "(SELECT FName FROM [20_Users] WHERE UserID = " & Convert.ToInt32(CentralScreen.UserIDText.Text) & "), " _
                                & "(SELECT LName FROM [20_Users] WHERE UserID = " & Convert.ToInt32(CentralScreen.UserIDText.Text) & "), " _
                                & "GETDATE(), " _
                                & "'I')"
        'Query Εξόδου Χρηστών...
        Public logout As String = "INSERT INTO [20_UserLog] " _
                                & "(UserID, FName, LName, Logdate, In_Out)" _
                                & "VALUES " _
                                & "(" & Convert.ToInt32(CentralScreen.UserIDText.Text) & ", " _
                                & "(SELECT FName FROM [20_Users] WHERE UserID = " & Convert.ToInt32(CentralScreen.UserIDText.Text) & "), " _
                                & "(SELECT LName FROM [20_Users] WHERE UserID = " & Convert.ToInt32(CentralScreen.UserIDText.Text) & "), " _
                                & "GETDATE(), " _
                                & "'O')"
        '==================================================================================================
        'Ορισμός των SQL Commands για το Login/Logout των χρηστών...
        Public loginCMD As New SqlCommand(login, SQLConn.Connection)
        Public logoutCMD As New SqlCommand(logout, SQLConn.Connection)
        '==================================================================================================
        Public Sub LoginRec()
            loginCMD.ExecuteNonQuery()
            SQLConn.Connection.Close()
        End Sub
        Public Sub LogoutRec()
            logoutCMD.ExecuteNonQuery()
            SQLConn.Connection.Close()
        End Sub
    End Module

    ...και καλείται από την παρακάτω ρουτίνα η οποία καλείται όταν ο χρήστης πατήσει το κουμπί "Χ" της φόρμας...

    1
    2
    3
    4
    5
     
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
             Handles Me.FormClosing
            LogoutRec()
            Application.Exit()
        End Sub

     ..αν μπορείτε να βοηθείσετε θα το εκτιμήσω πολύ....

    ευχαριστώ εκ των προτέρων....

    Αντώνης Ε. Κόλλιας
  •  05-05-2010, 14:12 58551 σε απάντηση της 58548

    Απ: Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

    Επειδή λογικά αυτό δεν θα έπρεπε να συμβαίνει, κάνε την εξής δοκιμή:

    Αφαίρεσε το Handles Me.FormClosing από το Private Sub Form1_FormClosing(...) και δοκίμασε να τρέξεις ξανά την εφαρμογή. Όταν φτάσεις στο επίμαχο σημείο, βάλε ένα breakpoint στην κλήση της LogoutRec και όταν το χτυπήσει, δες το Call Stack για να καταλάβεις πώς έχει φτάσει εκεί η εκτέλεση. Μπορεί κάπου αλλού να καλείται η FormClosing, μπορεί να υπάρχει κανένα AddHandler που να την προσθέτει δεύτερη φορά ως event handler για το συγκεκριμένο event. Αν δεν χτυπήσει καμία φορά το breakpoint, βάλε ξανά το Handles Me.FormClosing και δοκίμασε πάλι την ίδια διαδικασία και έλεγξε πάλι το Call Stack κάθε μία από τις δύο φορές που θα χτυπήσει. Αν δεν χτυπήσει δύο φορές αλλά μόνο μια, πάει να πει ότι κάπου αλλού υπάρχει το bug.

     


    Vir prudens non contra ventum mingit
  •  05-05-2010, 14:15 58552 σε απάντηση της 58551

    Απ: Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

    Επίσης, αν ο κώδικάς σου είναι production θα πρέπει απαραιτήτως να αλλάξεις αυτά τα string concatenations με parameterized queries γιατί διαφορετικά μπορεί οποιοσδήποτε κακόβουλος να σου κάνει SQL injection attack. Κάνε μια σχετική αναζήτηση και στο dotNETZone, το έχουμε ξανακουβεντιάσει το θέμα αρκετές φορές.

     


    Vir prudens non contra ventum mingit
  •  05-05-2010, 16:14 58554 σε απάντηση της 58552

    Απ: Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

    Αν κατάλαβα καλά θέλεις να βγάλω την 2η γραμμή που κάνει το handling .....το έκανα αλλά δεν περνάει καν απο εκεί..απλά κλείνει την εφαρμογή....στην προηγούμενη περίπτωση με το που το τρέχει περνάει από το application.exit() αλλά δεν το κλεινει ! ...θα κοιτάξω από εκεί μπας και έχω ξεχάσει κάτι...απλά μου κάνει εντύπωση.....αν έχεις να προτείνεις κάτι άλλο ευχαρίστως να το ακούσω...

    Αντώνης Ε. Κόλλιας
  •  05-05-2010, 16:19 58556 σε απάντηση της 58554

    Απ: Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

    Τελικά ήταν λάθος επιλογή event handler...το σωστό κομμάτι κωδικα είναι το εξής:

    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) _
             Handles Me.FormClosed
            Try
                LogoutRec()
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
            Application.Exit()
        End Sub

    Το δοκίμασα και δουλεύει κανονικά....

    Αντώνης Ε. Κόλλιας
  •  05-05-2010, 16:35 58557 σε απάντηση της 58556

    Απ: Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

    Το πρόβλημα δεν είναι η σωστή επιλογή handler, είναι το ότι κάνεις Application.Exit μέσα στο FormClosing. Το Application.Exit έχει ως αποτέλεσμα να τρέχουν όλοι οι FormClosing handlers από τις διάφορες φόρμες. Το ερώτημα είναι γιατί κάνεις Application.Exit μέσα από το FormClosing; Είσαι σε κάποια child φόρμα;

     


    Vir prudens non contra ventum mingit
  •  06-05-2010, 10:42 58563 σε απάντηση της 58557

    Απ: Το query τρέχει 2 φορές κατά το κλείσιμο της φόρμας....

    μια όθόνη που έχω για Login την καλώ με την LoginFrm.ShowDialog() μέσα από την CentralScreen.frm και το application.exit() το χρησιμοποιώ γιατί με βολεύει.....τι άλλο μπορώ να κάνω για να είναι πιο σωστή η εφαρμογή ?

    Αντώνης Ε. Κόλλιας
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems