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

 

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

Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

Îåêßíçóå áðü ôï ìÝëïò Dimitris Papadimitriou. Τελευταία δημοσίευση από το μέλος PanPan στις 13-02-2007, 09:53. Υπάρχουν 24 απαντήσεις.
Σελίδα 1 από 2 (25 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  20-11-2006, 13:39 20724

    Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Αν κάποιος από τους moderators νομίζει ότι το θέμα δεν ανήκει σε αυτό το forum ας το μετακινήσει. Επειδή εγώ έχω την τάση να τα "μεταφράζω" όλα σε αρχιτεκτονικά θέματα, δεν σημαίνει ότι απαραίτητα είναι!

    Στο θέμα μου: Έστω client/server εφαρμογή και πίνακας με 5 πεδία. Μέσω φόρμας ο τελικός χρήστης επεξεργάζεται τα 4 πεδία, ενώ το 5ο είναι readonly και τροποποιείται αυτόματα από κάποιο άλλο process του server. Όταν ο χρήστης έχει την φόρμα ανοιχτή και το 5ο αυτό πεδίο τροποποιηθεί, παίρνει ένα "concurrency violation" μήνυμα, όπως είναι αναμενόμενο. Με δεδομένα ότι θέλω να έχω τέτοιο έλεγχο για τα υπόλοιπα 4 πεδία, ποια λύση θα προτείνεται;

    Το update πίσω από την φόρμα γίνει με DataAdapter και Update σε ένα DataTable που έχει μια εγγραφή. Το update του 5ου πεδίου γίνεται με απευθείας update sql statement. Το πρόβλημα προφανώς είναι ότι το DataAdapter.Update περιλαμβάνει και το 5ο πεδίο, το οποίο ο χρήστης δεν μπορεί να πειράξει έτσι κι αλλιώς.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  20-11-2006, 13:47 20726 σε απάντηση της 20724

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Θα έλεγα ότι είναι ADO.NET θέμα και όχι τόσο αρχιτεκτονικής.

    Ως προς το πρόβλημα, κάνεις edit τo Update statement που γίνεται generate και αφαιρείς το 5ο πεδίο από το set και το where. Ανάλογα και αν χρησιμοποιείς stored procedures.
    Vir prudens non contra ventum mingit
  •  20-11-2006, 13:58 20731 σε απάντηση της 20726

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Απ'ότι κατάλαβα, θέλεις να ελέγχεις αν έχει τροποποιηθεί και κάποιο από τα 4 πεδία?

    Θα πρέπει να μέσα στο Update που στέλνεις να περνάς στο where και όλες τις παλιές τιμές των 4ων πεδίων, ώστε να γίνει το update μόνο αν δεν έχει αλλάξει κάτι.

    Το αν έχει γίνει το update μπορείς να το παρεις από τον αριθμό των updated γραμμών. Εναλλακτικά μπορείς να χρησιμοποιήσεις ένα 6ο πεδίο timestamp και να ελέγχεις στο where του update ότι δεν έχει αλλάξει.
    Simple Photography
  •  20-11-2006, 14:10 20732 σε απάντηση της 20731

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    ...στραβομάρα. Το ξέχασα το ado.net forum.

    Κατά τα άλλα, η λύση που ζητάω θα ήθελα να συνεχίσει να χρησιμοποιεί DataAdapter, μια που το DAL μου είναι generic. Απλά θα ήθελα να εξαιρέσω την 5ο πεδίο από το concurrency violation έλεγχο.

    Αν βάλω timestamp τότε και πάλι θα πάρω violation exception μια που και αυτό θα έχει αλλάξει, όταν αλλάζει το 5ο πεδίο από το άλλο process.

    Για να εκφράσω πάλι από την αρχή: Θέλω να φορτώνω όλη την γραμμή (5 πεδία), ο χρήστης να ενημερώνει τα 4 και απλά να βλέπει το 5ο και να μπορεί να κάνει update με dataadapter ακόμα κι αν έχει αλλάξει στο μεταξύ το 5ο πεδίο, αλλά όχι αν έχουν αλλάξει τα πρώτα 4!

    ps. Θέλω επίσης ένα καινούργιο 3άρι με πάρκινγκ και τζάκι στο Κολωνάκι με 200Ευρώ το μήνα (άντε 250!)
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  20-11-2006, 14:17 20734 σε απάντηση της 20732

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    OK εγώ δεν κατάλαβα καλά...

    Δες αυτό που σου λέει ο KelMan
    Simple Photography
  •  20-11-2006, 14:25 20736 σε απάντηση της 20732

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Μεταφέρθηκε στο ADO.NET forum.
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  20-11-2006, 14:25 20737 σε απάντηση της 20726

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

     KelMan wrote:
    Θα έλεγα ότι είναι ADO.NET θέμα και όχι τόσο αρχιτεκτονικής.

    Ως προς το πρόβλημα, κάνεις edit τo Update statement που γίνεται generate και αφαιρείς το 5ο πεδίο από το set και το where. Ανάλογα και αν χρησιμοποιείς stored procedures.


    Ευχαριστώ για την βοήθεια...
    πως το εννοείς το edit στο update statement, όταν χρησιμοποιείται dataadapter, οπότε System.Data.Common.DbCommand;

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  20-11-2006, 14:25 20738 σε απάντηση της 20732

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Προειδοποίηση: ακολουθεί μαμουνιά. Αν δε σου αρέσουν οι μαμουνιές, μη διαβάσεις παρακάτω.

    (Δεν μπόρεσες να αντισταθείς στον πειρασμό, ε; Stick out tongue)

    Αν το select στον DataAdapter σου κάνει λίιιιγο alias το πεδίο, π.χ. είναι
        SELECT ID, X, Y, Z, OtherField + '' AS W FROM MyTable
    τότε κατά την αυτόματη γέννηση του update θα παραλείψει το OtherField.
    Το απλό aliasing του πεδίου δεν αρκεί.

    Τώρα το μετάνιωσες που το διάβασες, σωστά;


    Νατάσα Μανουσοπούλου
  •  20-11-2006, 14:39 20741 σε απάντηση της 20738

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

     mns wrote:

    (Δεν μπόρεσες να αντισταθείς στον πειρασμό, ε; Stick out tongue)

    Όντως! Δεν έχω πρόβλημα με την μαμουνιά, μόνο που θα μου αλλάξει το όνομα του πεδίο στο datatable. Δεδομένου ότι χρησιμοποιώ typed datasets (τζιιιιζζζ!!!) και διάφορα metadata, αυτό θα ήταν καταστροφικό για το πεδίο αυτό!
    ps. μήπως καμιά μαμουνιά για το 3άρι στο Κολωνάκι;

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  20-11-2006, 15:09 20745 σε απάντηση της 20741

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Είτε χρησιμοποιείς DataAdapter, είτε TableAdapter, κάπου θα πρέπει να ορίζεται το update statement. Ακόμα και αν χρησιμοποιείς SPs, μέσα σε αυτές θα βρίσκεται το update statement. Πχ για τον OrderDetails της Northwind, το generated Update statement είναι το παρακάτω:



    UPDATE    [Order Details]
    SET              OrderID = @OrderID, ProductID = @ProductID, UnitPrice = @UnitPrice, Quantity = @Quantity, Discount = @Discount
    WHERE     (OrderID = @Original_OrderID) AND (ProductID = @Original_ProductID) AND (UnitPrice = @Original_UnitPrice) AND (Quantity = @Original_Quantity) AND
                           (Discount = @Original_Discount);
    SELECT OrderID, ProductID, UnitPrice, Quantity, Discount FROM [Order Details] WHERE (OrderID = @OrderID) AND (ProductID = @ProductID)

    Αν υποθέσουμε ότι θέλεις να αποφύγεις το conflict στο πεδίο Discount, τότε θα πρέπει να το κάνεις rewrite ως εξής:



    UPDATE    [Order Details]
    SET              OrderID = @OrderID, ProductID = @ProductID, UnitPrice = @UnitPrice, Quantity = @Quantity
    WHERE     (OrderID = @Original_OrderID) AND (ProductID = @Original_ProductID) AND (UnitPrice = @Original_UnitPrice) AND (Quantity = @Original_Quantity) ;
    SELECT OrderID, ProductID, UnitPrice, Quantity, Discount FROM [Order Details] WHERE (OrderID = @OrderID) AND (ProductID = @ProductID)

     


    Vir prudens non contra ventum mingit
  •  20-11-2006, 15:12 20748 σε απάντηση της 20741

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

     papadi wrote:

    Όντως! Δεν έχω πρόβλημα με την μαμουνιά, μόνο που θα μου αλλάξει το όνομα του πεδίο στο datatable. Δεδομένου ότι χρησιμοποιώ typed datasets (τζιιιιζζζ!!!) και διάφορα metadata, αυτό θα ήταν καταστροφικό για το πεδίο αυτό!
    ps. μήπως καμιά μαμουνιά για το 3άρι στο Κολωνάκι;


    (για το προκείμενο) Μπορείς να κάνεις το πεδίο alias στο ίδιο όνομα: SELECT ID, Descr + '' AS Descr FROM XYZ
    (για το 3άρι) Γίνε προικοθήρας! Και να είσαι βέβαιος ότι δε θα είσαι ο μόνος...


    Νατάσα Μανουσοπούλου
  •  20-11-2006, 16:10 20756 σε απάντηση της 20745

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

     KelMan wrote:

    Είτε χρησιμοποιείς DataAdapter, είτε TableAdapter, κάπου θα πρέπει να ορίζεται το update statement. Ακόμα και αν χρησιμοποιείς SPs, μέσα σε αυτές θα βρίσκεται το update statement. Πχ για τον OrderDetails της Northwind, το generated Update statement είναι το παρακάτω:



    UPDATE    [Order Details]
    SET              OrderID = @OrderID, ProductID = @ProductID, UnitPrice = @UnitPrice, Quantity = @Quantity, Discount = @Discount
    WHERE     (OrderID = @Original_OrderID) AND (ProductID = @Original_ProductID) AND (UnitPrice = @Original_UnitPrice) AND (Quantity = @Original_Quantity) AND
                           (Discount = @Original_Discount);
    SELECT OrderID, ProductID, UnitPrice, Quantity, Discount FROM [Order Details] WHERE (OrderID = @OrderID) AND (ProductID = @ProductID)

    Αν υποθέσουμε ότι θέλεις να αποφύγεις το conflict στο πεδίο Discount, τότε θα πρέπει να το κάνεις rewrite ως εξής:



    UPDATE    [Order Details]
    SET              OrderID = @OrderID, ProductID = @ProductID, UnitPrice = @UnitPrice, Quantity = @Quantity
    WHERE     (OrderID = @Original_OrderID) AND (ProductID = @Original_ProductID) AND (UnitPrice = @Original_UnitPrice) AND (Quantity = @Original_Quantity) ;
    SELECT OrderID, ProductID, UnitPrice, Quantity, Discount FROM [Order Details] WHERE (OrderID = @OrderID) AND (ProductID = @ProductID)


    Σωστά, αλλά πως μπορεί να γίνει αυτό χρησιμοποιώντας τον sql builder. Δεν θέλω να δημιουργώ εγώ τα update statements!


     mns wrote:

    (για το προκείμενο) Μπορείς να κάνεις το πεδίο alias στο ίδιο όνομα: SELECT ID, Descr + '' AS Descr FROM XYZ

    Εννοείς ότι θα το αγνοήσει ο commandbuilder στο update; Όντως μαμουνιά!!!

     mns wrote:

    (για το 3άρι) Γίνε προικοθήρας! Και να είσαι βέβαιος ότι δε θα είσαι ο μόνος...


    ...πλέον είναι αργά. Ότι έγινα... έγινα!

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  20-11-2006, 16:46 20763 σε απάντηση της 20756

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Χμμμμ... Κακομάθαμε μου φαίνεται... Δεν θα τα δημιουργείς... Θα τα αλλάζεις!
    Κοίτα, οτιδήποτε πέρα από το πεπατημένο σημαίνει ότι θα πρέπει να βάλεις χέρι, δεν γίνεται διαφορετικά καθώς ο generator των typed datasets είναι γενικής χρήσεως. Εκτός και αν έχεις όρεξη να φτιάξεις τον δικό σου generator που θα βασίζεται σε metadata των πεδίων για να τα κάνει exclude από το update Big Smile Πλάκα πλάκα, με το SMO δεν είναι και τόσο δύσκολο!

    Vir prudens non contra ventum mingit
  •  20-11-2006, 18:25 20772 σε απάντηση της 20724

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Οφ Τοπικ: Μάνο δεν την παλεύεις καθόλου Stick out tongue Να γράψει δικό του generator?..
    Παναγιώτης Κεφαλίδης

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

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  20-11-2006, 18:36 20773 σε απάντηση της 20772

    Απ: Αποφυγή Concurrency violation όταν αλλάζει συγκεκριμένο πεδίο

    Ναι! Να γράψει και μετά να τον κάνει post εδω! Big Smile

    Σοβαρά, αν είναι μεγάλο το project και έχει αξία reuse κάτι τέτοιο, τότε θα γλυτώσει αρκετό κόπο από το να γίνει χειροκίνητα η δουλειά. Αν τώρα είναι κάτι που θα γίνει για 2-3 queries, τότε είναι φασαρία. Πάντως, μπορεί να γίνει κάτι τέτοιο ακόμα και με CodeSmith.
    Vir prudens non contra ventum mingit
Σελίδα 1 από 2 (25 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems