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

 

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

LoadDataRow επενεξέταση

Îåêßíçóå áðü ôï ìÝëïò gmlogic. Τελευταία δημοσίευση από το μέλος infoCENTER στις 01-12-2007, 17:45. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-11-2007, 14:28 37885

    LoadDataRow επενεξέταση

    Επανέρχομε με το θέμα του LoadDataRow.
    Το είχαμε εξετάση και παλιότερα.
    Νόμιζα ότι είχε λυθή αλλά τώρα που το ξαναχρειάστηκα είδα πως δεν δουλέει όπωσ θέλω.
    Παραθέτω το παράδειγμα που είχαμε συζητήση
    Αυτό που θέλω είναι την δεύτερη φορά που τρέχει το loop νά κάνη modify
    im table As DataTable = New DataTable("table")
    Dim colItem As DataColumn = New DataColumn("item1", GetType(Integer))
    table.Columns.Add(colItem)
    colItem = New DataColumn("item2", GetType(String))
    table.Columns.Add(colItem)
    Dim PrimaryKey(0) As DataColumn
    PrimaryKey(0) = table.Columns("item1")
    table.PrimaryKey = PrimaryKey
    table.BeginLoadData()
    Dim newRow(table.Columns.Count - 1) As Object
    ' Set the values of the array.
    Dim row As DataRow = Nothing
    For i As Integer = 1 To 5
    Try
    newRow(0) = 1
    newRow(1) = "dddddd" & i
    row = table.LoadDataRow(newRow, False)

    Select Case row.RowState
    Case DataRowState.Added
    Console.WriteLine(DataRowState.Added.ToString)
    Case DataRowState.Modified
    Console.WriteLine(DataRowState.
    Modified.ToString)
    Case DataRowState.Unchanged
    Console.WriteLine(DataRowState.
    Unchanged.ToString)
    Case Else
    MsgBox("Uknown System.Enum=" & DataRowState.Added.ToString)
    End Select

    Catch ex As Exception
    Console.WriteLine(row.RowState.ToString)
    End Try

    Next
    table.EndLoadData()


    'Οταν το 
    fAcceptChanges είναι true πέρνω DataRowState.Unchanged
    'Οταν το  fAcceptChanges είναι False πέρνω μόνο DataRowState.Added

    Δεν ξέρω που κάνω λάθος

    Ευχαριστώ



    George Matzouranis
  •  30-11-2007, 15:11 37887 σε απάντηση της 37885

    Απ: LoadDataRow επενεξέταση

    Δεν κάνεις κάπου λάθος. Σωστά τα γράφεις, αλλά σωστή είναι και η συμπεριφορά που έχει το RowState με το fAcceptChanges.

    Θα προσπαθήσω να σου το εξηγήσω όσο απλά μπορώ με βάση και τον χρόνο που έχω. Έχουμε ένα DataTable το οποίο φορτώνει εγγραφές από την βάση. Κάποια στιγμή θα επιστραφούν τα δεδομένα στην βάση και ανάλογα με το RowState της κάθε εγγραφής που είχε φορτωθεί αρχικά απο την βάση, θα γίνουν και οι κατάλληλες αλλαγές.

    Τα πράγματα αρχίζουν να μπερδεύονται όταν φορτώσουμε μία νέα εγγραφή στο DataTable η οποία δεν είχει φορτωθεί εξ' αρχής από την βάση μας. Εκεί ποιο θα είναι το RowState αυτής της γραμμής όταν θα στείλουμε τις εγγραφές πίσω στην βάση για αποθήκευση. Θέλουμε να την αποθήκευσουμε στην βάση, ή απλά θέλουμε να την χρησιμοποιήσουμε για τους δικούς μας σκοπούς αλλά δεν θέλουμε να σωθεί στην βάση. Όταν γράφουμε την LoadDataRow αυτή αμέσως καλείτην AcceptChanges οπότε το RowState γίνεται Unchanged. Αυτό σημαίνει πρακτικά πως η εγγραφή μας δεν θα σωθεί στην βάση όταν όμως το fAcceptChanges είναι false τότε πέρνει RowState Added για να σωθεί και στην βάση. Κατά κάποιο τρόπο η λογική εδώ λειτουργεί ανάποδα από αυτά που διαβάζεις.

    Ελπίζω να έγινα έστω και λίγο κατανοητός δεδομένου και τις πίεσης του χρόνου που έχω και δεν μπορώ να επεκταθώ πιο αναλυτικά.

  •  30-11-2007, 15:34 37888 σε απάντηση της 37887

    Απ: LoadDataRow επενεξέταση

    Σε ευχαριστώ πολύ για τον χρόνο σου.
    Αν κατάλαβα καλά δεν μπορώ να κάνω modify μέχρι να σωθή η νέα εγγραφή στη βάση ;
    Ή δε είναι αυτός ο σωστός τρόπος να κάνω modify σε μία ήδη υπάρχουσα εγραφή ;
    Βασικά το table δεν διαβάζη από την βάση αλλά μαζεύει τι εγγραφές άλλου πίνακα που διαβάζη απο την βάση και θέλω οι εγγραφές στο νέο table να είναι unique και άν βρή το ίδιο (κλειδί) να κάνη modify.







    George Matzouranis
  •  30-11-2007, 15:58 37889 σε απάντηση της 37888

    Απ: LoadDataRow επενεξέταση

    Βεβαίως και μπορείς να κάνεις Modify. Από την στιγμή που το RowState είναι Added θα σωθεί και στην βάση και δεν θα αλλάξει το Rowstate από Added σε κάτι άλλο, αλλά θα παραμείνει το ίδιο. Όταν αποθηκεύσης την εγγραφή στην βάση και την φορτώσεις πάλι στην εφαρμογή σου τότε θα πάρει RowState Unchange στην αρχή. Μόλις αρχίσεις να κάνεις Modifications θα αλλάξει σε Changed κτλ...

    Είναι λίγο λεπτό το σημείο αυτό αλλά αν διαβάσεις με προσοχή το MSDN για αυτήν την περίπτωση και την σειρά με την οποία συμβαίνουν τα πράγματα θα καταλάβεις σωστά τι παίζεται με αυτό το fAcceptChanges και τη σενάρια εξυπηρετεί. Πες για παράδειγμα ότι θέλεις να προσθέσεις μία νέα εγγραφή μέσα στο DataTable αλλά δεν θέλεις να το σώσεις στην βάση σου όταν καλέσεις μία ας πούμε Update(DataTable) από κάπου.

    Σε αυτήν την περίπτωση υπάρχουν κάποιοι τρόποι για να το κάνεις αυτό. Ένας από αυτούς είναι και το flag fAccetChanges.

  •  30-11-2007, 16:16 37891 σε απάντηση της 37889

    Απ: LoadDataRow επενεξέταση

    Σε ευχαριστώ.
    Το πρόβλημα είναι ότι το νέο table δεν σώζετε στη βάση.
    Yπάρχη τρόπος να κάνω modify σε υπάρχουσες εγραφές του νέου table ;


    George Matzouranis
  •  30-11-2007, 16:38 37893 σε απάντηση της 37891

    Απ: LoadDataRow επενεξέταση

    Πάντα μπορείς να κάνεις Modify. Τo RowState χρησιμοποιείται μόνο στην περίπτωση που θέλεις (αν θέλεις) να αποθηκεύονται τα δεδομένα στην βάση. Διακρίνω όμως ένα μικρό μπέρδεμα για τα RowStates και Modifications. Διάβασε λίγο καλύτερα το MSDN εκεί μέσα βρίσκονται όλες οι απαντήσεις που ζητάς. 
  •  30-11-2007, 20:43 37895 σε απάντηση της 37893

    Απ: LoadDataRow επενεξέταση

    Επαναλαμβάνω λίγο το πρόβλημα μήπως μπορείς να βοήθησης.
    Όπως παρατηρής στο παράδειγμα το νέο table δεν είναι συνδεδεμένο με καμία βάση.
    Μπορώ λοιπόν να χρησιμοποιήσω την LoadDataRow για νά γεμίσω τον table
    Δηλ στο πρώτο Loop να κάνη Add και στο δεύτερο Loop να κάνη modify εφόσον βρήσκη το ίδιο item1.
    Ή πρέπει να χρησιμοποιήσω κάτι άλλο για να το κάνω.

    Ευχαριστώ κα πάλι.


    George Matzouranis
  •  30-11-2007, 21:00 37896 σε απάντηση της 37895

    Απ: LoadDataRow επενεξέταση

    Έτσι όπως γράφεις των κώδικά σου, όχι δεν θα το κάνει. Απλά θα προσθέτει εγγραφές που δεν υπάρχουν στο Table και τίποτα άλλο. Αν βρει μία εγγραφή που υπάρχει ήδη, αυτή σου επιστρέφεται μέσα στο Row object που σου δίνει το LoadDataRow. Μέσα από εκεί μπορείς να κάνεις τις όποιες αλλαγές θέλεις αν υπάρχει ήδη η εγγραφή στον πίνακα.

    Ελπίζω να βοήθησα...

  •  30-11-2007, 21:36 37897 σε απάντηση της 37896

    Απ: LoadDataRow επενεξέταση

    Συγνώμη αν σε κούρασα.
    Αλλά θέλω λίγο βοήθεια ακόμα Smile
    Έχουμε

    newRow(0) = 1
    newRow(1) = "ΑΑΑΑΑ"
    row = table.LoadDataRow(newRow, False)
    Προστήθετε μία εγραφή στο πίνακα Ok

    newRow(0) = 1
    newRow(1) = "BBBB"
    row = table.LoadDataRow(newRow, False)
    Θα προσθέση και άλλη εγραφή έτσι.

    Έγώ βασικά θέλω να μήν προσθέση άλλη εγγραφή αλλά το
    item2 να γίνη "ΒΒΒΒΒ"

    Και συγνώμη που επιμένω αλλά διαβάζω τα εξής.

    The LoadDataRow method takes an array of values and finds the matching value(s) in the primary key column(s).

    If the fAcceptChanges parameter is true or not specified, the new data is added and then AcceptChanges is called to accept all changes in the DataTable;

    if the argument is false, newly added rows are marked as insertions, and changes to existing rows are marked as modifications.


    Οπότε περιμένω την δεύτερη φορά αφού κάνη matching value(s) in the primary key column(s) να γυρίση σε modify

    Και όπως καταλαβαίνης δεν με ενδιαφέρη αυτό το παράδειγμα υπάρχη ένα ολοκληρο σκεπτικό από πίσω.
    Δηλ διαβάζουμε τι εγγραφές από ένα πίνακα κινήσεων ανά περίοδο και ανάλογα το Primary(Key) πχ κωδικό είδους να φτιάχνη ένα νέο table με τις περιόδους σαν κολώνες  ανά κωδικό είδους.

    Για αυτό επιμένω.

    George Matzouranis
  •  01-12-2007, 15:50 37919 σε απάντηση της 37897

    Απ: LoadDataRow επενεξέταση

    Μόνο που στην περίπτωση που γράφεις δεν έχει μία αρκετά σημαντική δήλωση κώδικα για να μπορείς να κάνεις Update με LoadDataRow. Και από ότι είδα ούτε Microsoft αλλά ούτε και κανένας άλλος το γράφει. Όλα τα παραδείγματα σταματάνε στο πρώτο κομμάτι πως να καταχωρής μία εγγραφή. Για να κάνει η LoadDataRow update σε εγγραφές που ήδη υπάρχουν θα πρέπει πριν από κάθε πιθανή αλλαγή να καλούμε την AcceptChanges.

    Δηλαδή μετά ακριβώς το For...Next, Try (στο παράδειγμα που έχεις γράψει) να γράφεις table.AcceptChanges.

    table.BeginLoadData()

    Dim newRow(table.Columns.Count - 1) As Object

    ' Set the values of the array.

    Dim row As DataRow = Nothing

    For i As Integer = 1 To 5

    table.AcceptChanges()

    newRow(0) = 1

    newRow(1) = "Updated" & i

    row = table.LoadDataRow(newRow, True)

    Next

    table.EndLoadData()

    Έτσι θα γίνονται και οι αλλαγές.

     

  •  01-12-2007, 17:36 37922 σε απάντηση της 37919

    Απ: LoadDataRow επενεξέταση

    Δυστηχώς πάλι κάνη μόνο add.
    Δεν κάνη Update την ήδη καταχωρημένη εγγραφή.
    Οπότε δεν μας κάνη.
    Για να προσθέσουμε Rows σε ένα πίνακα έχουμε καλύτερα την table.rows.add(datarow).
    Καλά πρωτού κάνω Add θα κάνω ένα Find στο πίνακα και αν βρίσκη εγγραφή θα κάνω Update


    Δεν ξέρω αν έχη κανένας συνάδελφος να προτείνη κάτι άλλο......

    Πάντως σε ευχαριστώ πολύ για τον χρόνο σου.




    George Matzouranis
  •  01-12-2007, 17:45 37924 σε απάντηση της 37922

    Απ: LoadDataRow επενεξέταση

    Συνημμένα: LoadDataRow.zip

    Σου στέλνω ένα παράδειγμα. Δες τον κώδικα, είναι αυτός που έχεις γράψει εσύ. Όπως θα δεις το κάνει με την προσθήκη της γραμμής που λέω.

     

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