<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ADO.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/78/ShowForum.aspx</link><description>Θέματα σχετικά με την προσπέλαση δεδομένων μέσω του ADO.NET και του System.Data namespace</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Entity Framework Massive Update</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/70974.aspx</link><pubDate>Wed, 25 Jul 2012 03:16:20 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:70974</guid><dc:creator>Markos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/70974.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=78&amp;PostID=70974</wfw:commentRss><description>Θα συμφωνήσω με τον Παναγιώτη, αλλά με τη σειρά μου θα ήθελα να ρωτήσω τι μπορεί να είναι τόσο περίπλοκο που δε μπορεί να γίνει με T-SQL. Επίσης, μήπως πρέπει να τροποποιήσεις λίγο το business logic, έτσι ώστε να μην χρειάζεται να γίνονται τέτοιου είδους updates κάθε χρόνο; Άντε να γίνει μια φορά με το στήσιμο της εφαρμογής, αλλά κι εμένα δε μου πάει το μυαλό τι είδους update μπορεί να είναι αυτό ώστε να τρέχει μια φορά το χρόνο. Και οι εγγραφές είναι 5.000.000 τώρα. Του χρόνου μπορεί να είναι 10 ή 15-μύρια, και πάει λέγοντας...&lt;br&gt;</description></item><item><title>Απ: Entity Framework Massive Update</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/70965.aspx</link><pubDate>Tue, 24 Jul 2012 04:57:10 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:70965</guid><dc:creator>koslyr</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/70965.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=78&amp;PostID=70965</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;Παναγιώτης Καναβός:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Είναι εντελώς λάθος να χρησιμοποιήσεις ένα ORM για batch updates γενικά, πόσο μάλλον όταν μιλάς για πολλές εγγραφές. Τα ORM υπάρχουν για να μπορείς να χρησιμοποιήσεις αντικείμενα με συγκεκριμένη συμπεριφορά στην εφαρμογή σου χωρίς να ασχολείσαι πως θα τα φορτώσεις από τη βάση. Εσύ όμως θέλεις απλά να πειράξεις πεδία στη βάση - δεν υπάρχει κανένα είδος συμπεριφοράς αντικειμένου εδώ. Για την ακρίβεια, δεν υπάρχουν καν αντικείμενα, μόνο πεδία κάποιου πίνακα.&lt;div&gt;Είναι επίσης λάθος να χρησιμοποιήσεις ADO.NET ή οποιαδήποτε άλλη client τεχνολογία. Για ποιό λόγο θα πρέπει να μεταφέρεις 5000000 εγγραφές στον client όταν θέλεις μόνο να κάνεις update στον server? Σκέψου μόνο πόσο κοστίζει η μεταφορά τόσων εγγραφών από το server στον client και μετά πάλι πίσω. Το αποτέλεσμα θα είναι να κρατήσει η διαδικασία πολύ περισσότερο απ' ότι περίμενες (μιλάμε για τάξεις μεγέθους), με πολύ μεγάλη πιθανότητα (~100%) να διακοπεί λόγω concurrency violations αν κάποιος άλλος κάνει updates στον πίνακα.&lt;/div&gt;&lt;div&gt;Η μόνη σωστή λύση εδώ είναι να χρησιμοποιήσεις SQL κώδικα για να κάνεις το batch update απευθείας στη βάση. Ακόμα και έτσι, θα πρέπει να προσέξεις πως θα κάνεις ένα τόσο μεγάλο update, καθώς τα κλειδώματα που θα γίνουν στη βάση θα κρατήσουν για πολλή ώρα με αποτέλεσμα να δημιουργήσεις πρόβλημα σε οποιονδήποτε άλλο χρησιμοποιεί τη βάση σου. Επιπλέον, μία τέτοια μαζική αλλαγή θα δημιουργήσει πολλές εγγραφές στο transaction log.&lt;/div&gt;&lt;div&gt;Τέλος, θα πρέπει να σκεφτείς ΓΙΑΤΙ χρειάζονται τόσο πολλά updates? Μία τέτοια απαίτηση συνήθως κρύβει κάποιο σχεδιαστικό λάθος. Τί είναι τα πεδία που θέλεις να αλλάξεις? Μήπως πρόκειται για λίγες τιμές οι οποίες θα έπρεπε να βρίσκονται σε ένα άλλο πίνακα αντί να επαναλαμβάνονται σε κάθε γραμμή?&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;Η συγκεκριμένη εργασία που αφορά την ενημέρωση του πεδίου αυτού σε αυτόν τον Πίνακα με τις 5.000.000 εγγραφές, γίνεται μια φορά τον χρόνο οπότε δεν προκειται για μια καθημερινή ή εβδομαδιαία εργασία, παρόλα αυτά θα με ενδιέφερε να υλοποιηθεί με τον βελτιστο τρόπο ώστε να ολοκληρώνεται στο ταχύτερο χρονικό διάστημα.&lt;br&gt;Όπως ανέφερες μάλλον με το ORM δεν θα μπορέσω να έχω το επιθυμητό αποτέλεσμα, αλλά για λογους ομοιογένειας κώδικα στην εφαρμογή μου που αφορά όλα το Data Access Layer&amp;nbsp; ήμουνα σε αναζήτηση μήπως βρω κάτι για την συγκεκριμένη υλοποίηση, ώστε η όλη επικοινωνία με την βάση να γίνεται μέσα από το Entity-Framework.&lt;br&gt;Επιπλέον για την χρήση του DataSet μάλλον θα ήταν χειρότερα να μεταφερω τοπικά στην μνήμη του client 5.000.000 εγγραφές. Το μόνο καλό στην περίπτωση αυτήν θα ήταν το μαζικό update μέσω του DataAdapter.&lt;br&gt;Για την υλοποίηση του Update μεσω ενός Store Procedure δεν με πολυ-βολευει, καθώς η ενημέρωση του πεδίου αυτού απαιτεί έναν σχετικά σύνθετο αλγόριθμο που μπορώ καλύτερα να τον διαχειρτιστώ σε C# παρά σε T-SQL.&lt;br&gt;&lt;br&gt;Αρχικά σκεφτόμουνα μια αρχική υλοποίηση σαν την παρακάτω για το μαζικό update:&lt;br&gt;&lt;br&gt;&lt;table style="background-color:#f2f2f2;border:solid 1px #e5e5e5;" border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tr style="vertical-align:top;line-height:normal;"&gt;&lt;td style="width:40px;text-align:right;"&gt;&lt;pre style="font-family:courier new;font-size:11px;color:gray;margin:0px;padding:2px;border-right:solid 1px #e7e7e7;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 &lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin:0px;padding:2px;padding-left:8px;"&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;void&lt;/span&gt; Execute()
        {
            SqlConnection readerConnection &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt;  
            SqlConnection(Properties.Settings.Default.ConnectionString);
            readerConnection.Open();

            SqlCommand cmd &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; SqlCommand(&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"SELECT ......"&lt;/span&gt;, readerConnection);
            SqlDataReader reader &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; cmd.ExecuteReader();

            SqlConnection writerConnection &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; SqlConnection(Properties.Settings.Default.ConnectionString);
            writerConnection.Open();

            SqlCommand writerCommand &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; SqlCommand(&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;""&lt;/span&gt;, writerConnection);

            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;while&lt;/span&gt; (reader.Read())
            {
                &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Do the process&lt;/span&gt;
                writerCommand.CommandText &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"UPDATE ......"&lt;/span&gt;;
                writerCommand.ExecuteNonQuery();
            }&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &lt;br&gt;&lt;/div&gt;</description></item><item><title>Απ: Entity Framework Massive Update</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/70963.aspx</link><pubDate>Mon, 23 Jul 2012 20:55:40 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:70963</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/70963.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=78&amp;PostID=70963</wfw:commentRss><description>Είναι εντελώς λάθος να χρησιμοποιήσεις ένα ORM για batch updates γενικά, πόσο μάλλον όταν μιλάς για πολλές εγγραφές. Τα ORM υπάρχουν για να μπορείς να χρησιμοποιήσεις αντικείμενα με συγκεκριμένη συμπεριφορά στην εφαρμογή σου χωρίς να ασχολείσαι πως θα τα φορτώσεις από τη βάση. Εσύ όμως θέλεις απλά να πειράξεις πεδία στη βάση - δεν υπάρχει κανένα είδος συμπεριφοράς αντικειμένου εδώ. Για την ακρίβεια, δεν υπάρχουν καν αντικείμενα, μόνο πεδία κάποιου πίνακα.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Είναι επίσης λάθος να χρησιμοποιήσεις ADO.NET ή οποιαδήποτε άλλη client τεχνολογία. Για ποιό λόγο θα πρέπει να μεταφέρεις 5000000 εγγραφές στον client όταν θέλεις μόνο να κάνεις update στον server? Σκέψου μόνο πόσο κοστίζει η μεταφορά τόσων εγγραφών από το server στον client και μετά πάλι πίσω. Το αποτέλεσμα θα είναι να κρατήσει η διαδικασία πολύ περισσότερο απ' ότι περίμενες (μιλάμε για τάξεις μεγέθους), με πολύ μεγάλη πιθανότητα (~100%) να διακοπεί λόγω concurrency violations αν κάποιος άλλος κάνει updates στον πίνακα.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Η μόνη σωστή λύση εδώ είναι να χρησιμοποιήσεις SQL κώδικα για να κάνεις το batch update απευθείας στη βάση. Ακόμα και έτσι, θα πρέπει να προσέξεις πως θα κάνεις ένα τόσο μεγάλο update, καθώς τα κλειδώματα που θα γίνουν στη βάση θα κρατήσουν για πολλή ώρα με αποτέλεσμα να δημιουργήσεις πρόβλημα σε οποιονδήποτε άλλο χρησιμοποιεί τη βάση σου. Επιπλέον, μία τέτοια μαζική αλλαγή θα δημιουργήσει πολλές εγγραφές στο transaction log.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Τέλος, θα πρέπει να σκεφτείς ΓΙΑΤΙ χρειάζονται τόσο πολλά updates? Μία τέτοια απαίτηση συνήθως κρύβει κάποιο σχεδιαστικό λάθος. Τί είναι τα πεδία που θέλεις να αλλάξεις? Μήπως πρόκειται για λίγες τιμές οι οποίες θα έπρεπε να βρίσκονται σε ένα άλλο πίνακα αντί να επαναλαμβάνονται σε κάθε γραμμή?&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;</description></item><item><title>Entity Framework Massive Update</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/70958.aspx</link><pubDate>Mon, 23 Jul 2012 08:49:45 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:70958</guid><dc:creator>koslyr</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/70958.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=78&amp;PostID=70958</wfw:commentRss><description>Θέλω σε ένα table στον SQL-Server να κάνω update τρια fields σε, σύνολο περίπου 5.000.000 εγγραφών .&lt;br&gt;Για την επικοινωνία με την βάση χρησιμοποιώ το Entity Framework και για το update μάλλον θα κάνω χρήση της LINQ (http://www.ezineasp.net/post/LINQ-to-Entities-Update-Operation-using-C-Sharp.aspx).&lt;br&gt;Όμως επειδή το σύνολο των εγγραφών που θελω να ενημερώσω είναι αρκετά μεγάλο σκεφτόμουνα μήπως τελικά είναι προτιμότερο από άποψη performance να επιλέξω τον παλιό παραδοσιακό ADO.Net με Dataset &amp;amp; DataAdapter ή καλύτερα να παραμείνω στο EF για ομοιογένεια.&lt;br&gt;</description></item></channel></rss>