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

 

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

LoadDataRow

Îåêßíçóå áðü ôï ìÝëïò gmlogic. Τελευταία δημοσίευση από το μέλος KelMan στις 15-04-2007, 21:23. Υπάρχουν 13 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-04-2007, 01:04 29202

    LoadDataRow

    Παραθέτω ένα παράδειγμα  για να περιγράψω το προβλημά μου....
    Dim 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
    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)
    Dim es As System.Enum = row.RowState
    Select Case es.ToString
    Case "Added"
    Console.WriteLine(es.ToString)
    Case "Modified"
    Console.WriteLine(es.ToString)
    Case "Unchanged"
    Console.WriteLine(es.ToString)
    Case Else
    MsgBox("Uknown System.Enum=" & es.ToString)
    End Select
    Catch ex As Exception
          Console.WriteLine(ex.ToString)
    End Try
    Next

    Διαβάζω για την μέθοδο ...

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

    If a column has a default value, pass a null value in the array to set the default value for that column. Similarly, if a column has its AutoIncrement property set to true, pass a null value in the array to set the automatically generated value for the row.

    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.

    Exceptions can also occur during either a ColumnChanging or RowChanging event. If an exception occurs, the row is not added to the table.

    Use LoadDataRow in conjunction with BeginLoadData and EndLoadData

    ........................................

    Στο δεύτερο Loop πέρνω Exception

    System.Data.ConstraintException: Column 'item1' is constrained to be unique.  Value '1' is already present.

    ενώ νομίζω θά έπρεπε να πάρω row.RowState="Modified"

    Τι μου ξεφεύγει ? Confused




    George Matzouranis
  •  15-04-2007, 11:25 29277 σε απάντηση της 29202

    Απ: LoadDataRow

    Σου ξέφυγε κάτι:

    newRow(0) = i

    και όχι

    newRow(0) = 1 


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  15-04-2007, 11:45 29281 σε απάντηση της 29277

    Απ: LoadDataRow

    και με την ευκαιρία μερικές βελτιώσεις στον κώδικά σου:

                    Select Case row.RowState

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

                    End Select

    ή ακόμα καλύτερα αντί για το Select case μπορείς να γράψεις αυτό:

                    Console.WriteLine(row.RowState.ToString) 


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  15-04-2007, 18:45 29344 σε απάντηση της 29277

    Απ: LoadDataRow

    Αγαπητέ Δημήτρη σε ευχαριστώ.
    Δεν είναι αυτό που μου ξεφεύγει.
    Επίτοιδες έχω newRow(0) = 1
    Δηλ στό πρώτο Loop να γίνη AddRow
    και επειδή το πρώτο Field του Table είναι PK και κατά συνέπεια Unique, περιμένω στο δεύτερο Loop να κάνη Modify
    Για αυτό δίνω την ίδια τιμή 1.


    George Matzouranis
  •  15-04-2007, 19:46 29355 σε απάντηση της 29345

    Απ: LoadDataRow

    To RowState για κάθε ένα DataRow αλλάζει κατάσταση όταν βρει το προηγούμενο RowState σε Unchanged. Αυτό συμβαίνει σε δύο περιπτώσεις. Ακριβώς αφότου γίνει το Load του πίνακα και αμέσως αφού εκτελεστεί η AcceptChanges. Γι αυτό και την πρώτη φορά παίρνεις το Added RowState ενώ τη δεύτερη χτυπάει. Αν όμως πριν το τέλος του loop βάλεις την εντολή table.AcceptChanges() θα δεις ότι κατόπιν το RowState γίνεται Modified.

     


    Vir prudens non contra ventum mingit
  •  15-04-2007, 20:07 29366 σε απάντηση της 29355

    Απ: LoadDataRow

    Μάνο το έκανα αλλά πέρνω και πάλι added row.RowState σtο δεύτερο Loop
       Dim 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)

                    Dim es As System.Enum = row.RowState
                    Select Case es.ToString
                        Case "Added"
                            Console.WriteLine(es.ToString)
                        Case "Modified"
                            Console.WriteLine(es.ToString)
                        Case "Unchanged"
                            Console.WriteLine(es.ToString)
                        Case Else
                            MsgBox("Uknown System.Enum=" & es.ToString)
                    End Select
                Catch ex As Exception
                    Console.WriteLine(ex.ToString)
                End Try
                table.AcceptChanges()
            Next


    George Matzouranis
  •  15-04-2007, 20:27 29376 σε απάντηση της 29366

    Απ: LoadDataRow

    Παίρνεις συνέχεια Added γιατί έχεις βάλει εκτός του loop το table.BeginLoadData()
    Αν το αφαιρέσεις, θα δεις ότι θα παίξει σωστά.


    Vir prudens non contra ventum mingit
  •  15-04-2007, 20:40 29379 σε απάντηση της 29376

    Απ: LoadDataRow

    Πράγματι αφαίρεσα το table.BeginLoadData() και έπαιξε σωστά
    Οπότε δεν χρειάζομε το table.BeginLoadData() ?



    George Matzouranis
  •  15-04-2007, 20:47 29384 σε απάντηση της 29379

    Απ: LoadDataRow

    Για τη συγκεκριμένη δουλειά, όχι.


    Vir prudens non contra ventum mingit
  •  15-04-2007, 21:12 29397 σε απάντηση της 29344

    Απ: LoadDataRow

    gmlogic:
    Αγαπητέ Δημήτρη σε ευχαριστώ.
    Δεν είναι αυτό που μου ξεφεύγει.
    Επίτοιδες έχω newRow(0) = 1
    Δηλ στό πρώτο Loop να γίνη AddRow
    και επειδή το πρώτο Field του Table είναι PK και κατά συνέπεια Unique, περιμένω στο δεύτερο Loop να κάνη Modify
    Για αυτό δίνω την ίδια τιμή 1.

    Έχεις δίκιο.... εσύ γράφεις LoadDataRow κι εγώ για κάποιο λόγο διάβαζα ImportRow. Στραβομάρα!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  15-04-2007, 21:14 29398 σε απάντηση της 29384

    Απ: LoadDataRow

    Σας ευχαριστώ πολύ όλους Smile

    George Matzouranis
  •  15-04-2007, 21:23 29399 σε απάντηση της 29398

    Απ: LoadDataRow

    Μην ξεχάσεις το "Κατάσταση Ενότητας" και το "Σημείωση ως Απάντησης"


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