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

 

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

Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

Îåêßíçóå áðü ôï ìÝëïò Ηλίας Κεκάκος. Τελευταία δημοσίευση από το μέλος Ηλίας Κεκάκος στις 08-07-2007, 15:53. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-07-2007, 10:29 33449

    Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

        Θέλοντας να απομονώσω τις εγγραφές που προστέθηκαν ή διαγράφηκαν ή άλλαξαν χρησιμοποίησα τον παρακάτω κώδικα:

    Dim AddedDataset as Dataset
    Dim Count as integer
    AddedDataset = OriginalDataset.GetChanges(Datarowstate.Added)
    Count=DataAdapter.Update(AddedDataset,"Table1")

      Το καλό με τον παραπάνω κώδικα είναι ότι με τον παραπάνω κώδικα μπορώ να πω στον χρήστη πόσες εγγραφές προστέθηκαν, διαγράφηκάν, άλλαξαν, αλλά και να διαχειρηστώ master-slave πίνακες. πχ αν table1 είναι master και table2 είναι slave τότε άν έχουμε διαγραφή πρώτα αφαιρούμε την εγγραφή του 2ου πίνακα και μετά του 1ου και αντίστροφα στην προσθήκη.

    Το πρόβλημα με το ανοτέρω είναι ότι δεν δουλεύει το SELECT @@IDENTITY. Για να σου επιστρέψει το ID θα πρέπει να χρησιμοποιήσεις το OriginalDataset και όχι το AddedDataset.

    Υπάρχει τρόπος να τα συνδυάσω όλα τα παραπάνω; Και αν ναι πως;

     

      Ευχαριστώ 

  •  08-07-2007, 10:45 33450 σε απάντηση της 33449

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

    Προφανώς το select @@identity το βάζεις στο insert command. Σωστά; Όταν λες ότι δεν δουλεύει; Δουλεύει αν δεν κάνεις getchanges και δεν δουλεύει αν το κάνεις;

    Ή δουλεύει και στις δυο περιπτώσεις αλλά έχεις πρόβλημα στο να κάνεις merge στη συνέχεια; 


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  08-07-2007, 10:59 33451 σε απάντηση της 33450

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

      Δεν μου επιστρέφει την τιμή αν χρησιμοποιήσω το GetChanges και δουλεύει αν χρησιμοποιήσω 'ολοκληρο' το Dataset δηλαδή

    DataAdapter.Update(OriginalDataset.GetChanges(DataRowState.Added),"Table1")   Δεν δουλεύει συγκεκριμένα δεν μου επιστρέφει στο control το νέο ID.

    DataAdapter.Update(OriginalDataset,"Table1")   Εδώ μου επιστρέφει την τιμή στο control.

      Είπες κάτι που δεν το έχω κάνει, να κάνω Merge το AddedDataset στο OriginalDataset, αυτό δεν εννοείς;

  •  08-07-2007, 11:12 33452 σε απάντηση της 33450

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

    Συνημμένα: screen_2007-07-08 11.09.38.jpg

    Χρησιμοποιόντας αυτόν τον κώδικα:

    oClass = New Class1
    Dim AddedDataset As New DataSet
    AddedDataset = DataSet.GetChanges(DataRowState.Added)
    DataSet.Merge(oClass.save(AddedDataset))

    Μου επιστρέφει 2 γραμμες στο Datagridview όπως βλέπεις στο αρχείο. Υπάρχει τρόπος να έχω ένα;

    Επίσης με την χρήση του GetChanges δεν δουλεύει το AcceptChanges μέσω του DataAdapter.Update πρέπει να το κάνεις εσυ.

    Το μόνο που κατάφερα να βρώ για την διαγραφή της μίας γραμμής χωρίς το ID που δεν υπάρχει στην ΒΔ είναι να κάνω RejectChanges κάτι που δεν το θεωρώ σωστό.

     


  •  08-07-2007, 12:01 33455 σε απάντηση της 33452

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

    Mπράβο... τώρα το εντοπίσαμε το πρόβλημα. Έχει ως εξής...

    Καταρχήν το merge είναι απαραίτητο, διαφορετικά είναι αδύνατο να έχεις στο αρχικό σύνολο δεδομένων (dataset Big Smile) το identity που υπάρχει σε αυτό που πήρες με getchanges. Τα δυο datasets είναι εντελώς αποκομμένα μεταξύ τους.

    Ο λόγος που παίρνεις δυο εγγραφές μετά το merge είναι ότι το dataset δεν έχει κάποιο στοιχείο για να συσχετίσει την εγγραφή στο original με την εγγραφή στο άλλο dataset, μια που το primary key έχει αλλάξει. Για να το πετύχεις αυτό πρέπει να αλλάξεις το property dataAdapter.AcceptChangesDuringUpdate σε false, έτσι ώστε να μην γίνει AcceptChanges από τον adapter και να το κάνεις εσύ μετά. Οπότε έτσι το dataset με τις αλλαγές θα κρατήσει και το αρχική τιμή του primary key.
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  08-07-2007, 12:09 33456 σε απάντηση της 33455

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

      Δημήτρη έχω την εντύπωση ότι είμαστε κοντα στην λύση αλλά κάτι δεν κάνω σωστά και δεν μου βγαίνει η λύση. Λοιπόν ο κώδικας είναι ο εξής:

    Private Sub buttonSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonSave.Click
    oClass = New Class1
    Dim AddedDataset As New DataSet
    AddedDataset = DataSet.GetChanges(DataRowState.Added)
    DataSet.Merge(oClass.save(AddedDataset))
    DataSet.AcceptChanges()
    End Sub

    Public Function save(ByVal dataset As DataSet) As DataSet
    DataAdapter.AcceptChangesDuringUpdate = False
    DataAdapter.Update(dataset, "test")
    Return dataset
    End Function

    Private Sub DataAdapter_RowUpdated(ByVal sender As Object, ByVal e As VistaDB.Provider.VistaDBRowUpdatedEventArgs) Handles DataAdapter.RowUpdated
    Dim cmdRefresh As VistaDBCommand
    cmdRefresh = New VistaDBCommand("SELECT @@IDENTITY", Connection)
    If e.Status = UpdateStatus.[Continue] AndAlso (e.StatementType = StatementType.Insert) Then
    e.Row("ID") = CInt(cmdRefresh.ExecuteScalar)
    e.Row.AcceptChanges()
    End If
    End Sub

      Μπορείσ να μου πείς που κάνω λάθος γιατί αυτός δεν δουλεύει.

     

     

     

     

  •  08-07-2007, 14:20 33457 σε απάντηση της 33456

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

    Νομίζω ότι το πρόβλημα είναι στην γραμμή e.Row.AcceptChanges. Αφαίρεσέ την και ξαναδοκίμασε.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  08-07-2007, 14:24 33458 σε απάντηση της 33457

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

    Συνημμένα: TestIdentity.rar

      Το αφαίρεσα και δεν έγινε τίποτα, δεν κάνει merge αλλα append. Βρήκα στο internet το παρακάτω:

    The difference could be the primary key. If ADO.NET encounters rows that
    have the same primary key values while it is merging data, it combines the
    contents into a single row.

      Τι λές;

    Ο κώδικας είναι

    Private Sub buttonSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonSave.Click
    oClass = New Class1
    If DataSet.GetChanges(DataRowState.Added) IsNot Nothing Then
    DataSet.Merge(oClass.save(DataSet.GetChanges(DataRowState.Added)))
    End If
    If DataSet.GetChanges(DataRowState.Deleted) IsNot Nothing Then
    DataSet.Merge(oClass.save(DataSet.GetChanges(DataRowState.Deleted)), False)
    End If
    DataSet.AcceptChanges()
    End Sub

    Public Function save(ByVal dataset As DataSet) As DataSet
    DataAdapter.AcceptChangesDuringUpdate = False
    DataAdapter.Update(dataset.Tables("test"))
    Return dataset
    End Function

    Private Sub DataAdapter_RowUpdated(ByVal sender As Object, ByVal e As VistaDB.Provider.VistaDBRowUpdatedEventArgs) Handles DataAdapter.RowUpdated
    Dim cmdRefresh As VistaDBCommand
    cmdRefresh = New VistaDBCommand("SELECT @@IDENTITY", Connection)
    If (e.StatementType = StatementType.Insert) Then
    e.Status = UpdateStatus.SkipCurrentRow
    e.Row("ID") = CInt(cmdRefresh.ExecuteScalar)
    End If
    End Sub

    ΥΓ. Σου επισυνάπτω τον κώδικα, μόνο που χρησιμοποιώ VistaDB ΒΔ που μπορείς να την κατεβάσεις στο www.vistadb.netι

     

  •  08-07-2007, 15:53 33459 σε απάντηση της 33458

    Απ: Πρόβλημα με Select @@Identity και καταχώρηση Master-Slave πινάκων

    Η απάντηση βρίσκετε εδώ: http://msdn2.microsoft.com/en-us/library/aszytsd8.aspx  και εδώ: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=155309&SiteID=1

    Χρησιμοποιώντας την DataAdapter.FillSchema όλα λειτουργουν στην εντέλεια.

    Public Function load() As DataSet
    DataAdapter.FillSchema(DataSet, SchemaType.Source, "test")
    DataAdapter.Fill(DataSet, "test")
    Return DataSet
    End Function

      Ευχαριστώ για την βοήθεια

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