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

 

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

Οι αλλαγές δεν αποθηκεύονται στη βάση

Îåêßíçóå áðü ôï ìÝëïò lexicon. Τελευταία δημοσίευση από το μέλος Μπλουγουράς Γιάννης στις 25-09-2010, 11:58. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-09-2010, 15:33 59956

    Οι αλλαγές δεν αποθηκεύονται στη βάση

    Γεια σας

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

           con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &  "D:\MyBase.MDB")
            con.Open()
          
            dAdapt = New Data.OleDb.OleDbDataAdapter("select * from customers where phone='" & Text1.Text  & "'", con)
               
            Dim table As New DataTable

            'Get the data from the database.
            dAdapt.Fill(table)
          

            'Get first row in table.
            If table.Rows.Count > 0 Then
                Dim row As DataRow = table.Rows(0)
                row.BeginEdit()
                row("surname") = mName
                row("address") = mAddress
                row("city") = city
                row("firstname") = mFirstNAme
                row("job") = MjOB
               
                row.EndEdit()
                row.AcceptChanges()
               
                dAdapt.Update(table)
           end if

    Ενώ δεν εμφανίζεται κανένα σφάλμα τα δεδομένα δεν αποθηκεύονται
    Εχει κανείς καμιά ιδέα;
    Ευχαριστώ
  •  11-09-2010, 21:03 59957 σε απάντηση της 59956

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Καλησπέρα,
    Η μέθοδος .AcceptChanges()  πρέπει να εκτελείται μετά από την μέθοδο .Update του TableAdapter.
    Η λειτουργία της είναι να αλλάζει τις καταστάσεις των γραμμών σε "UnChanged" και  να αφαιρεί τις γραμμές που είναι σε κατάσταση Deleted, αυτός είναι και ο λόγος που  στην μέθοδο .Update το TableAdapter δεν θα ανιχνεύει αλλαγές.

    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  16-09-2010, 13:23 60034 σε απάντηση της 59957

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Ευχαριστώ για την απάντηση

    Το άλλαξα αλλά τώρα έχω άλλο πρόβλημα

    Μου βγάζει το σφάλμα "Η δυναμικκή λειτουργία για το SQL για το UpdateCommand δεν υποστηρίζεται για το SelectCommand που δεν επιστρέφει καμία πληροφορία στήλης κλειδιών"

    Ευχαριστώ

  •  16-09-2010, 15:48 60038 σε απάντηση της 60034

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Εάν το SelectCommand σου δεν επιστρέφει κάποιο κλειδί (unique key) για να μπορέσει να το αναγνωρίσει το UpdateCommand σαν μοναδικό χαρακτηριστικό, τότε είναι λογικό να μην μπορεί να το δεχτεί καθώς δεν ξέρει πως να κάνει Update, όταν του το ζητήσεις.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  16-09-2010, 16:16 60041 σε απάντηση της 60034

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Ο αρχικός κώδικας δεν είναι ολοκληρωμένος,με τον τρόπο που είναι γραμμένος δεν υπάρχει UpdateCommand στο TableAdapter για να μπορεί να γίνει update.

    Ένα TableAdapter για να μπορεί να κάνει λειτουργίες CRUD, πρέπει να έχει 4 Commands ( InsertCommand, SelectCommand, UpdateCommand, DeleteCommand) .

    Ανάλογα με την κατάσταση σε κάθε DataRow του DataTable  κάνει χρήση ένα από τα παραπάνω Commands.


    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  18-09-2010, 15:23 60055 σε απάντηση της 60041

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Πως προτείνετε λοιπόν να γίνει?
  •  19-09-2010, 22:20 60077 σε απάντηση της 60055

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Σου γράφω παρακάτω τον κώδικα αλλά πιστεύω πως  το προσεγγίζεις  προγραμματιστικά λάθος.

    Το τηλέφωνο  που κάνεις χρήση για να βρείς τον πελάτη δεν είναι μοναδικό.

    Θα μπορούσες να έχεις 2 πελάτες που καλούν από το ίδιο κτίριο μιας εταιρίας, τότε θα είχαν διαφορετικά στοιχεία αλλά το ίδιο τηλέφωνο.

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

    Θα ήταν πιο εύκολο να χρησιμοποιήσεις Typed Dataset.

     Public Sub UpdateCustomer(ByVal phone As String, _
                                 ByVal firstname As String, _
                                 ByVal surName As String, _
                                 ByVal address As String, _
                                 ByVal city As String, _
                                 ByVal job As String)


            Dim connection As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MyBase.MDB")

            Dim adapter As OleDbDataAdapter = New OleDbDataAdapter()

            'Δημιουργία SelectCommand, καλύτερα να μην κάνεις χρήση το αστεράκι * στο Select εφόσον γνωρίζεις τα πεδία.
            Dim command As OleDbCommand = New OleDbCommand("SELECT * FROM Customers WHERE Phone = ?", connection)
            ' Προσθήκη παραμέτρους στο SelectCommand
            command.Parameters.Add("@Phone", OleDbType.VarWChar, 15).Value = phone

            adapter.SelectCommand = command


            ' Δημιουργία UpdateCommand.
            command = New OleDbCommand("UPDATE Customers SET Surname = ?, Firstname = ?, Address = ?, City = ?, Job = ? WHERE Id = ?", connection)

            ' Add the parameters for the UpdateCommand.
            command.Parameters.Add("@Surname", OleDbType.VarWChar, 32, "Surname")
            command.Parameters.Add("@Firstname", OleDbType.VarWChar, 32, "Firstname")
            command.Parameters.Add("@Address", OleDbType.VarWChar, 64, "Address")
            command.Parameters.Add("@City", OleDbType.VarWChar, 64, "City")
            command.Parameters.Add("@Job", OleDbType.VarWChar, 64, "Job")
            command.Parameters.Add("@Id", OleDbType.Integer, 4, "Id")

            adapter.UpdateCommand = command


            'Dim dataset = New DataSet
            Dim table As New DataTable
            adapter.Fill(table)


            'Get first row in table.
            If table.Rows.Count > 0 Then
                Dim row As DataRow = table.Rows(0)

                row("Surname") = surName
                row("Firstname") = firstname
                row("Address") = address
                row("City") = city
                row("Job") = job

                adapter.Update(table)
                row.AcceptChanges()
            End If

        End Sub

     

    Θα μπορούσες να μην κάνεις χρήση DataTable και να εκτελέσεις κατευθείαν το updateCommand.

     

     


    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  20-09-2010, 20:58 60141 σε απάντηση της 60077

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Ευχαριστώ πάρα πολύ για τον κόπο που έκανες.

    Για να δουλέψει πρέπει να υπάρχει πρωτεύον κλειδί? γιατι δεν έχω και συνεχίζει να μην αποθηκεύει

  •  21-09-2010, 00:03 60142 σε απάντηση της 60141

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Είναι καλή πρακτική να έχεις πρωτεύον κλειδί, διότι χαρακτηρίζει μοναδικά την κάθε εγγραφή στον πίνακα της βάσης δεδομένων. Όταν ορίζουμε ένα πεδίο ως πρωτεύον κλειδί, δεν επιτρέπονται ίδιες τιμές σε διαφορετικές εγγραφές.

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

    Προσπάθησε να κατανοήσεις πως λειτουργεί ο κώδικας για να μπορείς να τον αλλάξεις.

    Είναι όμως απαραίτητο να διαβάσεις για το ADO .NET και να κατανοήσεις πλήρως την λειτουργία του, αν θέλεις να γράφεις σωστό Data Access.

     

     


    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  23-09-2010, 16:34 60220 σε απάντηση της 60142

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Τελικα έλυσα το προβλημα με τις παρακάτω γραμμές

                sql = "UPDATE customers SET surname= '" & mName & "', ODOS = '" & mAddress & "', city= '" & city & " " & Zip & "', job= '" & MjOB & "' WHERE phone= '" & Text1.Text  & "'"
                oledbAdapter.UpdateCommand = con.CreateCommand
                oledbAdapter.UpdateCommand.CommandText = sql
                oledbAdapter.UpdateCommand.ExecuteNonQuery()

    Ψάχνοντας στο internet βρηκα πολλους τροπους οπως π.χ και τον δικό σου

    Αυτο που δεν μπορώ να καταλάβω με το .net είναι ποτε να χρησιμοποιήσω τον ενα τροπο και ποτε τον αλλο η ποια ειναι η διαφορα τους

  •  25-09-2010, 11:58 60251 σε απάντηση της 60220

    Απ: Οι αλλαγές δεν αποθηκεύονται στη βάση

    Η λύση που τελικά έδωσες δεν έχει καμια σχέση με αυτή που σου πρόσφερα εγώ.
    Είναι κακή πρακτική να κάνεις συνένωση String στο Command Text.
    Δημιουργείς ένα νέο Command και το εκτελείς εφόσον το έχεις τοποθετήσει σε ένα TableAdapter. Θα σου δώσω ένα παράδειγμα για να καταλάβεις.

    Έχεις στερεοφωνικό στο αυτοκίνητο και έχεις στερεοφωνικό στο σπίτι, και τα δύο παίζουν μουσική. Για να ακούσεις μουσική μπορείς να το κάνεις με δύο τρόπους με το στερεοφωνικό του αυτοκινήτου ή με το στερεοφωνικό του σπιτιού.

    Εσύ παίρνεις το στερεοφωνικό του σπιτιού και το βάζεις στο αυτοκίνητο για να ακούσεις μουσική.

    Ο κώδικας που σου έγραψα στο προηγούμενο Post είναι για να προσφέρει τροφή στο μυαλό σου έτσι ώστε να διαβάσεις και να κατανοήσεις το ADO .NET, OXI για να κάνεις εύρεση στις μηχανές αναζήτησης για μια οποιαδίποτε λύση.

    Τα βασικά του Ado .NET είναι :

    Connection
    Command
    DataReader

    Με τα παραπάνω κάνεις τα πάντα αλλά χρειάζεται περισσότερος κώδικας για να πετύχεις να κάνεις αυτά που σου προσφέρει το Dataset, Linq To Sql, Linq To Entities, NHibernate.

    To TableAdapter πάει πακέτο με το Dataset, χωρίς Dataset δεν υπάρχει λόγος να το χρησιμοποιήσεις.

    Το Dataset συνοπτικά είναι μία συλλογή από DataTables. Τα DataTables περιέχουν DataRows. Τα DataRows κρατάνε κατάσταση DataRowState (Unchanged, Added, Deleted, Modified)

    To TableAdapter χρησιμοποιείται για να γεμίσει το Dataset με δεδομένα και ενημερώσει την βάση δεδομένων με τις αλλαγές που έχουμε κάνει.

    To TableAdapter έχει 4 Commands InsertCommand, UpdateCommand, DeleteCommand, SelectCommand

    Ανάλογα με την κατάσταση της κάθε γραμμής σε ένα DataTable το TableAdapter.Update(Dataset) θα   εκτελέσει για κάθε γραμμή ένα από αυτά τα Commands πχ. Αν η κατάσταση ενός DataRow είναι Added θα εκτελέσει το InsertCommand.

     

     


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