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

 

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

compare dataset

Îåêßíçóå áðü ôï ìÝëïò gmlogic. Τελευταία δημοσίευση από το μέλος gmlogic στις 07-07-2005, 11:09. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-07-2005, 00:08 3313

    Geeked [8-|] compare dataset

    Αγαπητοι
    Πως μπορώ να κάνω compare σε δύο dataset
    Εξηγούμε
    Σε μία Form με διάφορα controls(textbox κλπ)συνδεδεμένα με Dataset1 εκτελείτε μιά αλλαγή πχ σε ένα textbox οπότε αλάζει το  dataset1.HasChanges και μας λέει
    εχει γίνει αλλαγη στο dataset1 επαναφέρουμε το textbox στή παλιά τιμη και έχουμε το 
    dataset1.HasChanges πάλι true
    Σκέφτηκα να κανώ dataset2=dataset1.copy() και μετά να συγκρίνω αυτά τα δύο
    dataset κατα το closing της Form
    Υπάρχει εντολή compare dataset ή πρέπει να συγκρίνω ολα τα items από τα datatables των dataset

    George M.Embarrassed

    Ευχαριστώ


    George Matzouranis
  •  05-07-2005, 01:54 3314 σε απάντηση της 3313

    Re: compare dataset

    Όχι δεν έχει κάποιο compare method γιατί είναι πολύ σχετικό τι θέλει να κάνει ο καθένας compare... Μιας και δεν εξηγείς τι ακριβώς θέλεις να κάνεις, θα σου δώσω μερικές πληροφορίες σχετικά με τους μηχανισμούς που παρέχει το Dataset για να κάνει track τις αλλαγές και ανάλογα βλέπεις τι μπορεί να σου χρησιμεύει και πως...
    Το HasChanges method είναι ένας από τους τρόπους να δείς αν έχει αλλάξει το dataset. Από εκεί και πέρα, μπορείς με το GetChanges method (είτε στο dataset, είτε στο datatable) να πάρεις τι αλλαγές και να τις χειριστείς.
    Τόσο το HasChanges, όσο και το GetChanges μπορούν να δεχθούν μία παράμετρο τύπου DataRowState. Τι είναι αυτό; Είναι ένα enumeration με τιμές όπως DataRowState.Added, DataRowState.Deleted, κλπ (δες MSDN) όπου πλέον σου επιτρέπει να ρωτήσεις αν έχει αλλαγές ενός συγκεκριμένου τύπου (πχ inserts ή deletes ανάλογα).
    Αντίστοιχα, το GetChanges επιστρέφει ένα υποσύνολο του object πάνω στο οποίο καλείται και αν περάσεις και το DataRowState τότε το υποσύνολο είναι ενός (ή παραπάνω, ανάλογα τι θα περάσεις) τύπου, πχ. όλες οι εγγραφές που έχουν γίνει update.
    Επίσης, υπάρχει και το DataTable.Select method το οποίο μπορεί προαιρετικά να δεχθεί μια DataRowState παράμετρο. Αυτό το method επιστρέφει ένα array από DataRow objects.
    Τέλος, μην ξεχνάς ότι πάντοτε για κάθε DataRow ενός DataTable κρατάς ταυτόχρονα όλες τις versions (τρέχουσα, αρχική, κλπ) και έτσι μπορείς να κάνεις ό,τι ελέγχους θέλεις.
    Α, ναι, ξέχασα και την GetChildRows ενός DataRow η οποία συμπεριφέρεται με την λογική της Select, παίρνοντας και αυτή προαιρετικά μια DataRowState παράμετρο, μόνο που τo DataRow array που επιστρέφει αφορά τα child rows ενός DataRow βάσει του DataRelation που έχει καθοριστεί.
    Άρα λοιπόν, δεν χρειάζεσαι δύο ξεχωριστά DataSets για να κάνεις compare γιατί όταν λες ότι έχεις ένα DataSet, ουσιαστικά έχεις πολλαπλά Datasets, το κάθε ένα με διαφορετικές εκδόσεις των δεδομένων, ανάλογα με το τι έχεις κάνει σε αυτά. Από εκεί και πέρα, μπορείς με διάφορα iterations να κάνεις ελέγχους, να ξεχωρίσεις τις εγγραφές που σε ενδιαφέρουν, κλπ...


    Vir prudens non contra ventum mingit
  •  05-07-2005, 11:55 3322 σε απάντηση της 3313

    Geeked [8-|] Re: compare dataset

    Ευχαριστώ για την απάντηση
    Το πρόβλημα είναι το εξής
    Γίνετε μια αλλαγή στη Φόρμα παίρνουμε dataset1.HasChanges = True επαναφέρουμε την αλλαγη(δηλ.διορθώνουμε παλι την τιμή ενός πεδίου όπως ήταν αρχικά)αλλά πάλι είναι dataset1.HasChanges = True
    Στό Closing λοιπόν έχουμε μύνημα έγινε αλλαγή ενώ ουσιαστικά δεν έγινε αλλαγή
    και δέ θέλω να ενημερώνω την βάση αφου δεν υπάρχει αλλαγή
    πχ

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' Fill the DataSet.

    dataset1.Fill(dsContacts)

    dataset2 = dataset1.Copy()

    End Sub

    ' The application is about to close. Make sure

    ' any changes to the data are safe.

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing

    ' Finish the current edit.

    dataset1.EndCurrentEdit()

    Dim RCountR As Integer, RCountC As Integer

    Dim TError As Boolean

    TError = False

    For RCountR = 0 To dataset1.Tables(0).Rows.Count - 1

    For RCountC = 0 To dataset1.Tables(0).Columns.Count - 1

    If dataset1.Tables(0).Rows(RCountR).Item(RCountC) <> dataset2.Tables(0).Rows(RCountR).Item(RCountC) Then

    TError = True

    Exit For

    End If

    Next

    Next

    If TError = True Then

    ' Ask the user if we should save the changes.

    Select Case MsgBox("Save changes?", MsgBoxStyle.YesNoCancel, "Save Changes?")

    Case MsgBoxResult.Yes

    ' Save the changes.

    SaveChanges()

    Case MsgBoxResult.Cancel

    ' Cancel the exit.

    e.Cancel = True

    Case MsgBoxResult.No

    ' Do nothing. Just exit.

    End Select

    End If

    End Sub

    Ευχαριστώ

    Wink

     


    George Matzouranis
  •  06-07-2005, 12:26 3340 σε απάντηση της 3322

    Re: compare dataset

    Φίλε qmlogic, λίγη υπομονή και οι ερωτήσεις σου θα απαντηθούν... Έσβησα το νέο post σου έτσι ώστε να υπάρχει ένα σημείο απάντησης...

    Λοιπόν, έχουμε και λέμε: Για να επαναφέρεις το Dataset/DataTable/DataRow στην αρχική κατάσταση υπάρχει μία μέθοδος που λέγεται RejectChanges (και μπορεί να εφαρμοσθεί αντίστοιχα και στα τρία αυτά data objects). Με αυτή τη μέθοδο ουσιαστικά αλλάζεις το version του κάθε row και το φέρνεις σε προηγούμενη κατάσταση. Άρα λοιπόν, μπορείς στον έλεγχο σου να δεις αν το current value είναι ίδιο με το original value του row και κατόπιν να κάνεις πάνω στο row RejectChanges. Πλέον το αν το HasChanges σου επιστρέφει true ή false θα εξαρτάται από τις ενέργειες πού έχουν γίνει στα υπόλοιπα rows.
    Τώρα που έχεις το hint, μπορείς να συνεχίσεις το ψάξιμο στο MSDN όπου θα βρεις άφθονο documentation τόσο για το HasChanges, όσο και για το RejectChanges καθώς και το συμπληρωματικό AcceptChanges.
    Vir prudens non contra ventum mingit
  •  06-07-2005, 14:46 3342 σε απάντηση της 3313

    Geeked [8-|] Re: compare dataset

    Αγαπητέ KelMan
    Η ερώτηση δεν είναι πως θα επανέλθω στη προηγούμενη κατάσταση
    αλλά σε μία αλλαγή πού γίνεται αν επαναφέρεις την αλλαγή το dataset1.HasChanges παραμένει True
    πχ
    1.ΚΑΤΑΣΤΑΣΗ
    Name="George Matz"
    dataset1.HasChanges=False
    2.ΑΛΛΑΓΗ
    Name="George BLABLA"
    dataset1.HasChanges=True
    3.ΕΠΑΝΑΦΟΡΑ
    Name="George Matz"
    dataset1.HasChanges=True
    4.Exit Form
    dataset1.HasChanges=True

    ThanksEmbarrassed



    George Matzouranis
  •  07-07-2005, 08:59 3363 σε απάντηση της 3342

    Re: compare dataset

    Ναι, το έχω καταλάβει το case σου... Και αυτό που προσπαθώ να σου εξηγήσω είναι ότι εξαρχής η λογική είναι λάθος... Άπαξ και αλλάξεις την τιμή το HasChanges έχει γίνει true και για να ξαναγίνει fasle θα πρέπει να κάνεις update μέσω του DataAdapter ο οποίος κατά τη διαδικασία του update, στο τελευταίο στάδιο, κάνει AcceptChanges.
    Εναλλακτικά, μπορείς να κάνεις κι εσύ AcceptChanges ή RejectChanges όμως το πως ακριβώς, εξαρτάται από το πως έχεις υλοποιήσει την εφαρμογή σου. Γι αυτό και σου έδωσα τις γενικές πληροφορίες που χρειάζεσαι για να αποφασίσεις πως θα το κάνεις.
    Για παράδειγμα, όπως ανέφερα και στο προηγούμενο post, μπορείς να συγκρίνεις τις τιμές των versions του row και αν είναι η νέα τιμή ίδια με την παλιά να αναιρέσεις την αλλαγή, προκαλώντας έμμεσα το HasChanges να γίνει false. Δηλαδή:

    If drCurCustomer.Item("Name", DataRowVersion.Current) = _
                         drCurCustomer.Item("Name", DataRowVersion.Default) Then

          drCurCustomer.RejectChanges()

    End If

    Υπάρχουν διάφορα σημεία που μπορείς να κολλήσεις αυτόν τον κώδικα, όπως στο event που τρέχει μετά το update του row ή όταν κάνεις validate την φόρμα, κλπ. Γι αυτόν το λόγο λέω ότι εξαρτάται πως έχεις φτιάξει την εφαρμογή. Επίσης, το DataRowVersion.Current και το DataRowVersion.Default πάλι είναι δύο από τις τέσσερις τιμές που μπορεί να πάρει το enumeration και μπορεί στην υλοποίησή σου να μην σου κάνουν. Γι αυτόν το λόγο θα πρέπει να διαβάσεις από το MSDN το πότε χρησιμοποιείται η κάθε τιμή του enumeration. Εκεί, έχει και ένα άλλο παράδειγμα σύκρισης τρέχουσας με προηγούμενης τιμής. Ελπίζω να σε βοήθησα γιατί πλέον δεν υπάρχει τίποτα παραπάνω επί του θέματος... πέραν του code review Smile


    Vir prudens non contra ventum mingit
  •  07-07-2005, 11:09 3365 σε απάντηση της 3363

    Geeked [8-|] Re: compare dataset

    Οκ
    Σε ευχαριστώ πολύ
    για το κόπο σου και την υπομονή σου
    Γιώργος
    Broken Heart


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