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

 

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

dataset και πεδιο με δεκαδικά

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος Antonios Chatzipavlis στις 03-01-2013, 21:49. Υπάρχουν 15 απαντήσεις.
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-12-2012, 14:55 71723

    dataset και πεδιο με δεκαδικά

    Γεια σας παιδιάέχω ένα xml αρχείο και το κανω insert σε ένα πίνακα του sql server με την μέθοδο SqlBulkCopy.

    το xml αρχείο στις άριθμιτικές τιμές τα δεκαδικά είναι με κομμα (,)όταν μπαίνουν ομως στην βάση μου τότε δεν τα καταλαβαόινει.

    Στην βάση το πεδίο είναι ανοιγμένο ως float.

    ο κώδικας:

    DataSet ds = new DataSet();
    DataTable sourceData = new DataTable();
    ds.ReadXml("ImpCustomers.xml");
    sourceData = ds.Tables[5];
    
                using (SqlBulkCopy bulkCopy =
                            new SqlBulkCopy(connection.ConnectionString))
                {
                    // column mappings
                    bulkCopy.ColumnMappings.Add("id", "id");               
                    bulkCopy.ColumnMappings.Add("sc_yavg_00", "sc_yavg_00");
                    bulkCopy.ColumnMappings.Add("sc_yavg_01", "sc_yavg_01");
                    bulkCopy.ColumnMappings.Add("sc_yavg_02", "sc_yavg_02");
                    bulkCopy.ColumnMappings.Add("sc_yavg_03", "sc_yavg_03");
    
                    bulkCopy.DestinationTableName = "customer";
                    bulkCopy.WriteToServer(sourceData);
                }

     

     

     

  •  10-12-2012, 15:21 71724 σε απάντηση της 71723

    Απ: dataset και πεδιο με δεκαδικά

    Σωστά δεν το καταλαβαίνει. Ο SQL Server περιμένει να δει dot(.) για decimal separator και τίποτα άλλο.
    Και δεν έχει να κάνει σε τίποτα το collation που έχει χρησιμοποιηθεί είτε στο server έιτε στην database.
    Για να λυθεί το θέμα σου υπάρχουν αρκετοί τρόποι απο το να κανείς replace το , με .  Μέχρι να χρησημοποιηθει xsd πριν φορτωθούν τα δεδομένα στο dataset



    Antonios Chatzipavlis

  •  10-12-2012, 15:44 71725 σε απάντηση της 71724

    Απ: dataset και πεδιο με δεκαδικά

    Ωπωπωπωπωπ! Κόμμα για δεκαδικό σε XML ?????? Από πότε????

    Η XML έχει τύπους για αριθμητικά δεδομένα και η υποδιαστολή είναι ΠΑΝΤΑ η τελεία. Υποψιάζομαι ότι ο κώδικας που φτιάχνει το XML αντί να χρησιμοποιεί κάποιο xsd γράφει χύμα κείμενο χωρίς έλεγχο για το πως μετατρέπονται τα αριθμητικά ή οι ημερομηνίες. Ή ακόμα χειρότερα, αντί να αποθηκεύει τα αριθμητικά ως ... αριθμητικά, τα μετατρέπει σε string και μετά τα αποθηκεύει.

    Αντί να ψάχνουμε τί θα γίνει με το dataset, καλύτερα να διορθωθεί το XML. Αν ο δημιουργός του XML δεν θέλει ή δεν μπορεί να το διορθώσει, θα πρέπει να φτιαχτεί κάποιο άλλο πρόγραμμα το οποίο θα συνεφέρει το XML.

    Επίσης, καλό είναι να γίνει και ένας έλεγχος για το πως περνάνε οι ημερομηνίες γιατί είμαι σίγουρος ότι θα υπάρχει και εκεί θέμα. Και για ημερομηνίες έχει τύπους η XML με αυστηρά καθορισμένο format.

    Τα κόλπα με αντικατάσταση , και . πετυχαίνουν μόνο σε ειδικές συνθήκες. Για την ακρίβεια, "σκάνε" έτσι και αλλάξει για κάποιο λόγο το locale στο οποίο τρέχει ο κώδικας που παράγει τα προβληματικά δεδομένα. Αν πχ. το locale αλλάξει σε Αμερικάνικο και αρχίσουν τα δεδομένα να έρχονται με μορφή 1,234.56, η αντικατάσταση θα καταστρέψει ένα αριθμό ο οποίος ήταν ήδη σωστός.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-12-2012, 17:35 71728 σε απάντηση της 71725

    Απ: dataset και πεδιο με δεκαδικά

    false alarm

    στο XML τα δεκαδικά είναι με . και όχι με ,

    sorry εκ παραδρομής το έγραψα

    οπότε μολις εγώ τα έβαζα μέσα, δεν καταλάβαινε ότι ήταν δεκαδικά και μου τα χάλαγε.

    για να παίξει σωστά έβαζα εγώ , στα ποσά

     

     

  •  10-12-2012, 18:09 71729 σε απάντηση της 71728

    Απ: dataset και πεδιο με δεκαδικά

    Ούτε αυτό είναι σωστό. Αυτό σημαίνει ότι εισάγεις τα δεδομένα ως text και προσπαθείς να τα αποθηκεύσεις σε αριθμητικό πεδίο, σε SQL Server ο οποίος έχει στηθεί σε ελληνικό locale. Το αποτέλεσμα είναι ότι ο SQL Server προσπαθεί να αποθηκεύσει την τιμή με αυτό το Locale και αποτυγχάνει.

    Αν έχεις το schema του XML αρχείου, χρησιμοποίησε πρώτα την ReadXmlSchema πριν όταν φορτώνεις το dataset για να φορτώσεις τα αριθμητικά ως decimals και να αποφύγεις την μετατροπή. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  11-12-2012, 01:14 71731 σε απάντηση της 71729

    Απ: dataset και πεδιο με δεκαδικά

    ένα παράδειγμα για την ReadXmlSchema;

     

  •  03-01-2013, 12:53 71819 σε απάντηση της 71731

    Απ: dataset και πεδιο με δεκαδικά

            private void Impfintzirospelpr2()
            {
                string sql = "";
                string tmp = "";
                sql = "select d.id, isnull(replace(d.tziros,'.', ','),0)tziros " +
                    "from tziros d " +
                    "where d.id = (" + id + ")";
    
                atlwebsrv.IAtlantisservice atl = new atlwebsrv.IAtlantisservice();
                atl.Url = url;
                tmp = atl.GetQueryData(sql, "", user, password);
    
                XmlDocument xdoc = new XmlDocument();
                xdoc.LoadXml(tmp);
                xdoc.Save("Imptziros.xml");
    
                XmlNodeList elemList = xdoc.GetElementsByTagName("ROW");
                int k = elemList.Count;
                if (k > 0)
                {
                    DataSet ds = new DataSet();
                    DataTable sourceData = new DataTable();
                    ds.ReadXml("Imptziros.xml");
                    sourceData = ds.Tables[5];
    
                    using (SqlBulkCopy bulkCopy =
                                new SqlBulkCopy(connection.ConnectionString))
                    {
                        bulkCopy.ColumnMappings.Add("id", "id");
                        bulkCopy.ColumnMappings.Add("tziros", "tziros");
    
                        bulkCopy.DestinationTableName = "tziros";
                        bulkCopy.WriteToServer(sourceData);
                    }
                }
            }

     

     

    Τα γυρισα σε decimal αλλά πάλι δεν τα φέρνει σωστά

    Το sourceData σαν column tziros το γυρίζει σε String.

    Δοκίμασα και έκανα copy σε νέο table και άλλαξα το type του column σε Decimal, Double μπας και, αλλά δεν.

    Στον SQL το πεδίο ειναι τύπου float

  •  03-01-2013, 13:11 71820 σε απάντηση της 71819

    Απ: dataset και πεδιο με δεκαδικά

    Εξακολουθείς να επιμένεις ότι η βάση επιστρέφει string αντί για numeric στα numeric πεδία. Η εντελώς περιττή replace που έχεις στο query μόλις μετέτρεψε το tziros σε text στη ΒΑΣΗ, χρησιμοποιώντας το collation της ΒΑΣΗΣ. Το αποτέλεσμα της replace θα είναι ένα string το οποίο μπορεί να σημαίνει οτιδήποτε, ανάλογα με το ποιό locale θα χρησιμοποιήσεις για να το μεταφράσεις. Έχεις ήδη χάσει τα αρχικά σου δεδομένα από τον server.

    Για να πεισθείς ότι ο ήλιος ανατέλει στην ανατολή, κάνε το εξής. Φτιάξε μία άλλη βάση, με ένα μόνο πίνακα, με ένα numeric πεδίο. Όχι float, γιατί το float αντιστοιχεί σε floating point και έχει περιορισμένη ακρίβεια. Όχι ότι επηρεάζει την μορφή με την οποία θα διαβάσεις τα δεδομένα, απλά για να μην έχεις τυχόν απώλειες λόγω στρογγυλοποιήσεων.

    Γράψε 2-3 εγγραφές στον πίνακα και μετά διάβασε τες σε ένα datatable χωρίς ΚΑΜΜΙΑ μετατροπή.

    Ύστερα ή βάλε ένα breakpoint μετα το Read για να δεις τί περιέχει το DataTable, ή κάνε assign τις αριθμητικές τιμές που διάβασες σε decimal variables με απλό cast. Στη μία περίπτωση, θα δεις ότι οι στήλες που διάβασες είναι decimal. Στη δεύτερη θα δεις ότι ΔΕΝ θα σκάσει το cast, κάτι που θα συνέβαινε αν είχες διαβάσει string.

    Αφού πεισθείς για αυτό, μένει να δεις τί σου επιστρέφει το web service. Αν υπάρχει πουθενά το schema, κοίτα τί data type χρησιμοποιεί για τα αριθμητικά πεδία. Αν είναι text, έμπλεξες καθώς θα πρέπει να μαντέψεις τί collation σου επιστρέφει το service και να κάνεις μετατροπή από την text τιμή σε κάποιο decimal. Μπορείς π.χ. να προσθέσεις ένα ακόμα decimal column στο datatable για κάθε τέτοιο text πεδίο και να το γεμίσεις με τα αποτελέσματα της Decimal.Parse στην οποία θα περάσεις το locale του web service

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-01-2013, 15:53 71822 σε απάντηση της 71820

    Απ: dataset και πεδιο με δεκαδικά

    delete me

  •  03-01-2013, 16:19 71824 σε απάντηση της 71822

    Απ: dataset και πεδιο με δεκαδικά

    Για να μην τραβάμε το μαλλιά μας από την αρχή του χρόνου μπορείς σε παρακαλώ να μας δείξεις το τι σου επιστρέφει το Ατλαντίς χωρίς να γίνει καμια αλλαγή παρέμβαση σε αυτό ζητάω να δω αυτό που βάζεις στην tmp
    Antonios Chatzipavlis

  •  03-01-2013, 16:26 71825 σε απάντηση της 71824

    Απ: dataset και πεδιο με δεκαδικά

    Antonios Chatzipavlis:
    Για να μην τραβάμε το μαλλιά μας από την αρχή του χρόνου μπορείς σε παρακαλώ να μας δείξεις το τι σου επιστρέφει το Ατλαντίς χωρίς να γίνει καμια αλλαγή παρέμβαση σε αυτό ζητάω να δω αυτό που βάζεις στην tmp

    Υποθέτω ότι εννοείς ΧΩΡΙΣ κανένα replace ...

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-01-2013, 16:34 71826 σε απάντηση της 71825

    Απ: dataset και πεδιο με δεκαδικά

    ΧΩΡΙΣ ΤΙΠΟΤΑ ΕΝΑ ΑΠΛΟ SELECT και να το δούμε. Το Ατλαντις στην βάση του συνήθως χρησιμοποιεί float data type (καλώς η κακώς αυτό χρησιμοποιεί) και θα το λέω πάντα μέχρι να πεθάνω ο SQL Server πάντα την υποδιαστολή την έχει τελειά(.) και δεν έχει thousand seps


    Antonios Chatzipavlis

  •  03-01-2013, 17:24 71828 σε απάντηση της 71826

    Απ: dataset και πεδιο με δεκαδικά

    Ειδες σε προφύλαξα απο το χάσιμο των μαλιών σου:

                XmlReader reader = XmlReader.Create("Impfintzirospelpr2.xml");
                XmlSchemaSet schemaSet = new XmlSchemaSet();
                XmlSchemaInference schema = new XmlSchemaInference();
                schemaSet = schema.InferSchema(reader);
                using (FileStream asddd = new FileStream("Impfintzirospelpr2.xsd", FileMode.Create))
                {
                    foreach (XmlSchema s in schemaSet.Schemas())
                    {
                        s.Write(asddd);
                    }
                }
  •  03-01-2013, 17:33 71833 σε απάντηση της 71828

    Απ: dataset και πεδιο με δεκαδικά

    χα χα χα Παναγιώτη τι λέγαμε στο msn?

    Ημουν σχεδόν σίγουρος ότι έχει το σχήμα μέσα του


    Antonios Chatzipavlis

  •  03-01-2013, 20:09 71837 σε απάντηση της 71833

    Απ: dataset και πεδιο με δεκαδικά

    παιδιά μην με παρεξηγείτε, άλλωστε όπως έγραψα και σε άλλο topic σε κλίμακα 0-100 πιστεύω ότι είμαι στο 0

     

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