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

 

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

code analysis

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 14-12-2012, 11:44. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-12-2012, 23:37 71750

    code analysis

    Γεια σας παιδιά.

    Εχω φτιάξει αυτήν την μεθοδο που λειτουργεί μια χαρα ή έτσι νομίζω τουλάχιστον.

     

            private void insData()
            {
                if (resultGV.Rows.Count > 0)
                {
    
                    DataTable insdt = new DataTable();
    
                    insdt = resultGV.DataSource as DataTable;
    
                    using (SqlBulkCopy bulkCopy =
                                new SqlBulkCopy(connection.ConnectionString))
                    {
                        // column mappings fyeid, un_custid, qty, val, code
                        bulkCopy.ColumnMappings.Add("id", "id");
                        bulkCopy.ColumnMappings.Add("code", "code");
                        bulkCopy.ColumnMappings.Add("descr", "descr");
                        bulkCopy.ColumnMappings.Add("catid1", "catid1");
                        bulkCopy.ColumnMappings.Add("cost1", "cost1");
                        bulkCopy.ColumnMappings.Add("vtcid", "vtcid");
                        bulkCopy.ColumnMappings.Add("grouptxt", "grouptxt");
    
                        bulkCopy.DestinationTableName = "material";
                        bulkCopy.WriteToServer(insdt);
                    }                
                    MessageBox.Show("Τέλος εξαγωγής", "Τέλος", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

     

    Η ερώτησεις μου:

    1. Βλέπετε κάποιο λάθος;
    2. Στο code analysis μου βγάζει ότι δεν κάνω dispose το datateble μου. Και εδώ έχω τα ερωτήματά μου: Δεν πρέπει να το κάνει μονο του αυτό το .net; Τι θα "πρέπει" να κάνω;

    Ευχαριστώ

     

  •  14-12-2012, 00:01 71751 σε απάντηση της 71750

    Απ: code analysis

    Το datatable είναι fully managed, συνεπώς δεν χρειάζεται dispose.

    To NET δεν κάνει dispose από μόνο του.
  •  14-12-2012, 11:44 71754 σε απάντηση της 71751

    Απ: code analysis

    nikos123:
    Το datatable είναι fully managed, συνεπώς δεν χρειάζεται dispose.


    Δεν έχει καμμία σημασία αν κάποια κλάση χρησιμοποιεί μόνο Managed resources ή όχι, για το αν χρειάζεται το Dispose. Από τη στιγμή που μία κλάση υλοποιεί το IDisposable interface, σου λέει ότι ΧΡΕΙΑΖΕΤΑΙ να κάνεις Dispose διαφορετικά κάποια ακριβά resources θα δεσμευτούν για περισσότερη ώρα απ' ότι χρειάζεται. Γι αυτό και ο compiler ειδοποιεί ότι υπάρχει ένα αντικείμενο, το οποίο έχει ειδοποιήσει ότι χρειάζεται Dispose, το οποίο όμως αφήνεται στην τύχη του.

    Το .NET κάποια στιγμή θα εκτελέσει ένα garbage collection και θα μαζέψει το περιττό datatable, μέχρι εκείνη τη στιγμή όμως, το DataTable θα παραμένει στη μνήμη. 

    Ειδικά για το DataTable, αξίζει αυτή η απάντηση στο StackOverflow που εξηγεί για ποιό λόγο το DataTable απαιτεί την Dispose.

    Όσον αφορά τον ίδιο τον κώδικα, το warning ειδοποιεί για ένα άλλο πρόβλημα. Η παρακάτω γραμμή:
    DataTable insdt = new DataTable();
    insdt = resultGV.DataSource as DataTable;
    δημιουργεί ένα DataTable και ΑΜΕΣΩΣ το πετάει, για να το αντικαταστήσει με ένα άλλο. Προφανώς, το πρώτο DataTable δεν γίνεται ποτέ Dispose. 
    Θα έπρεπε να είναι 
    DataTable insdt ;
    insdt = resultGV.DataSource as DataTable;
    ή ακόμα καλύτερα
    DataTable insdt =resultGV.DataSource as DataTable;

    Μήπως ο αρχικός κώδικας ήταν γραμμένος σε VB.NET? Εκεί μία μεταβλητή ορίζεται ως 
    Dim insdt As DataTable
    οπότε μπορεί κάποιος να έβαλε κατά λάθος ένα New, μετά να έγινε το cast κλπ κλπ. Ακόμα και στην VB.NET όμως μπορείς να γράψεις σωστά την ίδια γραμμή:
    Dim insdt As DataTable= CType(resultGV.DataSource,DataTable)
    Τέλος, το συγκεκριμένο cast θέλει λίγη προσοχή, καθώς το as επιστρέφει null αν αποτύχει το cast. Το αποτέλεσμα θα είναι να σκάσει ο κώδικας όταν θα προσπαθήσει να γράψει στο server. 
    Είναι προτιμότερο αντί για as να χρησιμοποιηθεί το παρακάτω:
    DataTable insdt=(DataTable)resultGV.DataSource;
    Το οποίο θα σκάσει λέγοντας ξεκάθαρα ότι το DataSource δεν είναι DataTable.

    Εναλλακτικά θα πρέπει να μπει έλεγχος ότι το insdt δεν είναι null και να μην προχωρήσει το Bulk Import

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems