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

 

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

map MySql field into MS SQL Server + data transfer

Îåêßíçóå áðü ôï ìÝëïò Harkon. Τελευταία δημοσίευση από το μέλος Harkon στις 17-01-2013, 12:53. Υπάρχουν 13 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-01-2013, 20:14 71947

    map MySql field into MS SQL Server + data transfer

    Καλησπέρα σας,

    έχω μια βάση δεδομένων mysql-5 με κάποιους πίνακες και θέλω απλά να κάνω dump τα δεδομένα σε πίνακες του MS SQL Server 2008.

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

    Field Name Type
    MySql:  Total  decimal(15,4)
    MSSql: -//- το δοκίμασα αρχικά decimal(15,4) και μετά και numeric(15,4)

    (Άσχετο: η mysql είχε πολλά πεδία τύπου int(11) και τα έκανα map σε numeric(11,0) καλά έκανα; )

    Παίρνω τα δεδομένα της mysql μέσα σε ένα dataset και το κάνω parse για να βάλω μια-μια τις εγγραφές στον MS Sql.

    'mazi me oles tis params exoyme kai ayti pou me endiaferei
    Dim p43 As New SqlParameter("@total", SqlDbType.Decimal)
    p43.Precision = 4
    p43.Size = 15
    
    'parakatw...
    Dim myDataRow As DataRow
    
    For Each myDataRow In dSet.Tables(0).Rows
    
       'as poyme pws exei mono ayto to field..
       sql = "INSERT INTO [order](total) VALUES(@total)"
     
       With cmd
          p43.Value = IIf(IsDBNull(myDataRow("total")), DBNull.Value, myDataRow("total"))
          .Parameters.Add(p43)
          .CommandText = sql
          .ExecuteNonQuery()
    
          .Parameters.Clear()
       End With
    
    Next
    Στην πρώτη εγγραφή που είναι να βάλει μέσα, η τιμή του πεδίου total στη mysql είναι: 124.2300 και παίρνω το μήνυμα λάθους: 
    "Parameter value '124.2300' is out of range"

    Τι φταίει;

    υγ: αν πάω παραπάνω στον κώδικα και βάλω με το χέρι, p43.Value = 0  
    τότε παίζει κανονικά.

    Ευχαριστώ

  •  16-01-2013, 02:19 71949 σε απάντηση της 71947

    Απ: map MySql field into MS SQL Server + data transfer

    δώσε μας το script του πίνακα (CREATE TABLE) τόσο σε SQL όσο και σε MySQL 


    Antonios Chatzipavlis

  •  16-01-2013, 09:05 71950 σε απάντηση της 71949

    Απ: map MySql field into MS SQL Server + data transfer

    Antonios Chatzipavlis:

    δώσε μας το script του πίνακα (CREATE TABLE) τόσο σε SQL όσο και σε MySQL 


    //MSSQL  
    //μονο για το πεδιο που με ενδιαφερει, τα αλλα τα παραλείπω, είναι μεγάλος ο πίνακας

    CREATE TABLE [dbo].[order](
    [total] [decimal](15, 4) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

    ALTER TABLE [dbo].[order] ADD  CONSTRAINT [DF_order_total]  DEFAULT ((0)) FOR [total]
    GO

    //MYSQL
    CREATE TABLE `order` (
     `total` decimal(15,4) NOT NULL DEFAULT '0.0000'
    ) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 COLLATE=utf8_bin




  •  16-01-2013, 10:34 71951 σε απάντηση της 71950

    Απ: map MySql field into MS SQL Server + data transfer

    τελικά έβαλα datatype = money και από ότι βλέπω παίζει..

    έχει κάποιος να προτείνει κάτι άλλο ως διόρθωση/βελτίωση;
  •  16-01-2013, 11:04 71952 σε απάντηση της 71951

    Απ: map MySql field into MS SQL Server + data transfer

    Δεν διόρθωσες το πρόβλημα, και περιττό να πούμε ότι τέτοια πράγματα δεν συμβαίνουν αν δεν έχει γίνει κάτι στραβό. Δοκίμασες να βάλεις την τιμή καρφωτή? Αν αυτό παίζει, το πρόβλημα βρίσκεται στα δεδομένα που διαβάζεις. Μήπως διαβάζεις τα αρχικά δεδομένα ως text και προσπαθείς να τα αποθηκεύσεις ως decimal? Αν συμβαίνει αυτό και το μηχάνημα σου ή ο SQL Server έχει ελληνικό locale, το '.' είναι η χιλιάδα και ο SQL θα προσπαθήσει να κάνει την αντίστοιχη μεαταρτατροπή.

    Καταρχήν, βεβαιώσου ότι το πεδίο "total" του datatable είναι όντως αριθμητικό (decimal, float, double). Πρόσεξε όμως, ότι αν δεν είναι decimal, μπορεί λόγω rounding errors η τιμή που προσπαθείς να στείλεις να μην είναι ακριβώς αυτή που έχεις δώσει αλλά να συνοδεύεται από Ν 9άρια. Μετά, βάλε τον SQL Server Profiler για να δεις τί ακριβώς εντολές στέλνονται στον SQL Server. 

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

    Απ: map MySql field into MS SQL Server + data transfer

    Παναγιώτης Καναβός:
    Δεν διόρθωσες το πρόβλημα, και περιττό να πούμε ότι τέτοια πράγματα δεν συμβαίνουν αν δεν έχει γίνει κάτι στραβό. Δοκίμασες να βάλεις την τιμή καρφωτή? Αν αυτό παίζει, το πρόβλημα βρίσκεται στα δεδομένα που διαβάζεις. Μήπως διαβάζεις τα αρχικά δεδομένα ως text και προσπαθείς να τα αποθηκεύσεις ως decimal? Αν συμβαίνει αυτό και το μηχάνημα σου ή ο SQL Server έχει ελληνικό locale, το '.' είναι η χιλιάδα και ο SQL θα προσπαθήσει να κάνει την αντίστοιχη μεαταρτατροπή.

    Καταρχήν, βεβαιώσου ότι το πεδίο "total" του datatable είναι όντως αριθμητικό (decimal, float, double). Πρόσεξε όμως, ότι αν δεν είναι decimal, μπορεί λόγω rounding errors η τιμή που προσπαθείς να στείλεις να μην είναι ακριβώς αυτή που έχεις δώσει αλλά να συνοδεύεται από Ν 9άρια. Μετά, βάλε τον SQL Server Profiler για να δεις τί ακριβώς εντολές στέλνονται στον SQL Server. 

    Καλησπέρα,

    1. Δοκίμασα να βάλω την τιμή "καρφωτά" μέσα από sql INSERT INTO... και μπήκε κανονικά

    2. Όσο για το αν το διαβάζω ως string, δεν νομίζω... Κάνω ένα select * from order από την mysql, τα βάζω σε ένα dataset όπως είναι 
    adapter = New MySqlDataAdapter(sql, cnDest)
    dSet = New DataSet
    adapter.Fill(dSet)
    και μετά όπως έγραψα και παραπάνω..
    Dim p43 As New SqlParameter("@total", SqlDbType.Decimal)
    p43.Precision = 4
    p43.Size = 15
    
    'parakatw...
    Dim myDataRow As DataRow
    
    For Each myDataRow In dSet.Tables(0).Rows
    
       'as poyme pws exei mono ayto to field..
       sql = "INSERT INTO [order](total) VALUES(@total)"
     
       With cmd
          p43.Value = IIf(IsDBNull(myDataRow("total")), DBNull.Value, myDataRow("total"))
          .Parameters.Add(p43)
          .CommandText = sql
          .ExecuteNonQuery()
    
          .Parameters.Clear()
       End With
    
    Next

    3. Υπάρχει όμως κάποιος συγκεκριμένος τρόπος για να δω αν το πεδίο  "total" είναι αριθμητικό στο datatable? Γιατί και πως όμως να το έχει αλλάξει; 

    πάντως επειδή είδα ότι και το money δίνει 4 δεκαδικά ψηφία, το έβαλα και βλέπω πως εμφανίζει σωστά τους αριθμούς μέσα στον MSSQL.

    Αυτό με τον Profiler θα το κάνω και θα γράψω τα αποτελέσματα. 
    Αν έως τότε κάποιος έχει κάποια διόρθωση-παρατήρηση ευχαριστώ εκ των προτέρων.

  •  16-01-2013, 22:45 71961 σε απάντηση της 71959

    Απ: map MySql field into MS SQL Server + data transfer

    Αντί να γράψεις εσύ την διαδικασία μεταφοράς των δεδομένων δοκίμασες να την κάνεις με τον import wizard ή με κάποιο δικό σου SQL Server Integration Package?

    Λογικά θα μεταφερθούνε σαν νεράκι.

    Όσον αφορά το datatype money, αυτό πλέον είναι για σκοπούς συμβατότητας στο σύντομο μέλλον θα καταργηθεί για αυτό καλύτερα decimal


    Antonios Chatzipavlis

  •  16-01-2013, 22:51 71962 σε απάντηση της 71961

    Απ: map MySql field into MS SQL Server + data transfer

    θέλω να τρέχει μαζί με ένα άλλο scheduled task και έχω φτιάξει webservice για να τραβάω τα δεδομένα διότι παίζουν firewalls με δικαιώματα κτλ και δεν ξέρω πόσο υλοποιήσιμο στις συνθήκες αυτές είναι αυτό που προτείνεις.

    Ωχ με αγχώνεις τώρα για το Money....

    ευχαριστώ πάντως!!
  •  16-01-2013, 23:12 71963 σε απάντηση της 71962

    Απ: map MySql field into MS SQL Server + data transfer

    Με τα SQL Server Integration Services μπορείς να καλέσεις και web services και φυσικά να τα έχεις scheduled. Θα σου έλεγα να τους ρίξεις μια ματιά...


    Antonios Chatzipavlis

  •  17-01-2013, 00:35 71965 σε απάντηση της 71947

    Απ: map MySql field into MS SQL Server + data transfer

    Harkon:
    'mazi me oles tis params exoyme kai ayti pou me endiaferei
    Dim p43 As New SqlParameter("@total", SqlDbType.Decimal)
    p43.Precision = 4
    p43.Size = 15
    


    Αν και θα πρέπει να ακολουθήσεις τις οδηγίες του Αντώνη, για το συγκεκριμένο πρόβλημα έχω την εντύπωση ότι έχει παρερμηνευτεί το context των SqlParameter properties, Size, Scale και Precision.

    Precision: Gets or sets the maximum number of digits used to represent the Value property.
    Scale: Gets or sets the number of decimal places to which Value is resolved.
    Size: Gets or sets the maximum size, in bytes, of the data within the column.

    Μάλλον, πρέπει να βάλεις Precision=15, Scale=4 και να "σβήσεις" την Size.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  17-01-2013, 01:22 71966 σε απάντηση της 71965

    Απ: map MySql field into MS SQL Server + data transfer

    Πολύ σωστή η παρατήρηση του Μάρκου
    Antonios Chatzipavlis

  •  17-01-2013, 09:38 71967 σε απάντηση της 71966

    Απ: map MySql field into MS SQL Server + data transfer

    Ουπς! Στραβομάρα μας! 

    Όσον αφορά το SSIS σίγουρα είναι πολύ βολικότερο να το χρησιμοποιήσεις και να βάλεις π.χ. τον SQL Server Agent να τρέχει το package 1 φορά τη μέρα.  Το καλό είναι ότι μπορείς να κάνεις τις αλλαγές απευθείας στο package σου και δεν χρειάζεται να κάνεις recompile τον κώδικα, ενώ απαραίτητα στοιχεία όπως το transaction management και το Logging είναι διαθέσιμα ως settings. Πόσοι από εμάς θυμόνται ή ΠΡΟΛΑΒΑΙΝΟΥΝ να βάλουν σωστό logging σε μία bulk import procedure?



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-01-2013, 09:43 71968 σε απάντηση της 71966

    Απ: map MySql field into MS SQL Server + data transfer

    πωπωω... πολλά όμορφα πράγματα!

    πάω να τα δοκιμάσω και σας λέω!

    1000 ευχαριστώ!

    btw...  η mysql είχε πολλά πεδία τύπου int(11) τα οποία έκανα map σε numeric(11,0) καλά έκανα;
  •  17-01-2013, 12:53 71972 σε απάντηση της 71965

    Απ: map MySql field into MS SQL Server + data transfer

    Markos:
    Harkon:
    'mazi me oles tis params exoyme kai ayti pou me endiaferei
    Dim p43 As New SqlParameter("@total", SqlDbType.Decimal)
    p43.Precision = 4
    p43.Size = 15
    


    Αν και θα πρέπει να ακολουθήσεις τις οδηγίες του Αντώνη, για το συγκεκριμένο πρόβλημα έχω την εντύπωση ότι έχει παρερμηνευτεί το context των SqlParameter properties, Size, Scale και Precision.

    Precision: Gets or sets the maximum number of digits used to represent the Value property.
    Scale: Gets or sets the number of decimal places to which Value is resolved.
    Size: Gets or sets the maximum size, in bytes, of the data within the column.

    Μάλλον, πρέπει να βάλεις Precision=15, Scale=4 και να "σβήσεις" την Size.

    είχες απόλυτο δίκιο !

    τα έφτιαξα όπως λες και άλλαξα και την βάση από money -> decimal(15,4) και παίζει μια χαρά!

    άλλαξα και τα numeric(10,0) -> decimal(10,0)

    θα κοιτάξω και το θέμα που είπατε με τα SQL Server Integration Services και θα ξεκινήσω άλλο θέμα αν χρειαστεί.
    ας θεωρήσουμε το τρέχων ως απαντημένο.

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