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

 

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

Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

Îåêßíçóå áðü ôï ìÝëïò Teo. Τελευταία δημοσίευση από το μέλος Teo στις 24-11-2006, 10:55. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-11-2006, 21:04 20669

    Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

    Υλοποιώ μια εφαρμογή σε .net 2.0 που διαβάζει πίνακα πίνακα από ενα Odbc και περνάει τα data σε μια βάση στον SQL 2005 Express. Για λόγους απαιτήσεων, αυτό πρέπει να υλοποιηθεί με .net και όχι με SSIS ή με άλλο τρόπο. Για τους ίδιους λόγους, οι πίνακες του SQL δεν πρέπει να εχουν κλειδιά ή constraints
    Αυτό που κάνω είναι το εξής: Διαβάζω τον πίνακα από το ODBC και βάζω τα data σε ένα dataset ds1. Στη συνέχεια φτιάνω dataAdapter κάνοντας select από τον αντίστοιχο πίνακα του SQL Express και βάζω τα data σε ένα άλλο dataset ds2(αρχικά ο πίνκας του SQL και το ds2.Tables[0] δεν έχουν data). Μετά με την ImportRow περνάω τα data από τον πίνακα του ds1 στον πίνακα του ds2 (εδώ όμως το Rowstate εξακολουθεί να παραμένει Unchanged ). Στην συνέχεια κάνω dataAdapter.Fill(ds2) αλλά λόγω του Rowstate , δεν εισάγεται καμία εγγραφή στον πίνακα του SQL Express.
    Επειδή οι πίνακες είναι πολλοί και έχουν πολλές columns, δεν με συμφέρει να χτίσω objects καθώς διαβάζω και στη συνέχεια να κανω insert με stored procedures. Αυτό που θέλω είναι να διαβάζω το dataset από το Odbc και να το περνάω στον SQL Express
    Καμιά ιδέα για το πώς μπορώ να λύσω το πρόβλημα?

    Σημείωση: Είχα κάνει αρχικά το post κάτω από το "SQL Server και άλλες Databases" αλλά το έσβησα, ελπίζω να μην δημιούργησα πρόβλημα Smile
  •  18-11-2006, 21:11 20671 σε απάντηση της 20669

    Απ: Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

    Εγώ θα έκανα το εξής: Θα έκανα ένα νέο κενό datatable χρησιμοποιώντας έναν adapter της μορφής "SELECT * FROM MYTABLE WHERE 1=2"

    Στη συνέχεια θα χρησιμοποιούσα datareader για να διαβάσω τον source πίνακα και θα περνούσα τα δεδομένα στο datatable, στήλη προς στήλη. Κάθε 50 εγγραφές θα αποθήκευα και θα καθάριζα το dataset για να μην φρακάρω την μνήμη σε περίπτωση μεγάλων πινάκων.

    Αν πάλι θέλεις να φορτώσεις όλο την πίνακα και να τον αποθηκεύεις με ένα adapter.update τότε φόρτωσε τον source πίνακα σε ένα datatable, κάνε ένα foreach και εκτέλεσε την εντολή row.item(0)=row.item(0). Αυτό θα κάνει το rowstate της κάθε γραμμής changed, παρόλο που δεν άλλαξε η τιμή. Στη συνέχεια αποθήκευσε απευθείας το datatable στην άλλη βάση, χρησιμοποιώντας ένα δεύτερο adapter. Δεν χρειάζεται να αντιγράφεις τα δεδομένα από ένα datatable σε ένα άλλο.
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  18-11-2006, 21:12 20672 σε απάντηση της 20671

    Απ: Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

    Το άλλο post δεν το έσβησες! Υπάρχει ακόμα:http://www.dotnetzone.gr/cs/forums/20668/ShowPost.aspx#20668
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  18-11-2006, 21:23 20674 σε απάντηση της 20671

    Απ: Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

    Μετέφερα την ερώτηση στο ADO.NET γιατί δεν έχει καμμία σχέση με Winforms. Θα σβήσω το αρχικό post και θα αντιγράψω εδώ την απάντηση που έδωσα σε αυτό. Παρακαλώ να προσέχουμε που καταχωρούμε τις ερωτήσεις γιατί δημιουργείται πρόβλημα
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-11-2006, 21:23 20675 σε απάντηση της 20674

    Απ: Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

    Υπάρχει κάποιος λόγος που διαβάζεις τα δεδομένα από τον πίνακα του SQL Express? Αν θέλεις απλά να μεταφέρεις τα δεδομένα από τον ένα πίνακα στον άλλο, η γρηγορότερη λύση είναι να χρησιμοποιήσεις ένα data reader που θα διαβάσει τα δεδομένα από το ODBC και να εκτελέσεις ένα stored procedure ή sql statement που θα εισάγει την κάθε γραμμή στον πίνακα του sql express. Αν ο table adapter που έχεις φτιάξει περιλαμβάνει και την επιλογή δημιουργίας direct method, μπορείς να καλέσεις αυτές αντί να γράφεις το sql από την αρχή.

    Αν θέλεις οπωσδήποτε να χρησιμοποιήσεις δύο dataset, θα πρέπει να χρησιμοποιήσεις την DataTable.Rows.Add. Η ImportRow αντιγράφει μία γραμμή ακριβώς στην κατάσταση που βρισκόταν, (inserted, updated ή χωρίς αλλαγές) ενώ η Add θα την προσθέσει σαν καινούργια γραμμή. Σε κάθε περίπτωση πάντως, θα πρέπει να καλέσεις την DataAdapter.Update στο τέλος, όχι την DataAdapter.Fill για να γράψεις τις αλλαγές στη βάση.

    Άλλη μία δυνατότητα είναι να χρησιμοποιήσεις τη μέθοδο Load του DataTable με ένα DataReader που διαβάζει από το ODBC και μετά να καλέσεις την Update
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-11-2006, 00:26 20683 σε απάντηση της 20675

    Απ: Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

    Εφόσον παίζεις σε ADO.NET 2.0 θα σου πρότεινα να δεις την SqlBulkCopy. Δε νομίζω καμία άλλη λύση να σου δώσει καλύτερο performance. Ρίξε μια ματιά στο msdn όπως επίσης και σε αυτό το άρθρο: Speed Up Copy Operations with SqlBulkCopy. Ακόμη, μπορείς να συνδυάσεις το SqlBulkCopy με SMO και να κάνεις τη δουλειά σου πλήρως αυτοματοποιημένα...


    Vir prudens non contra ventum mingit
  •  24-11-2006, 10:55 21063 σε απάντηση της 20683

    Απ: Πρόβλημα κατά τη μεταφορά δεδομένων με .net 2.0 από Odbc σε SQL Express

    Σας ευχαριστώ όλους για τη βοήθεια. Η εφαρμογή μου είναι Win Forms 2.0. Δοκίμασα και τις δύο λύσεις, (dataReader και SqlBulkCopy).

    Το πρόβλημα προκύπτει όταν πάω να αντιγράψω από το ODBC τα data ενός πίνακα ο οποίος έχει κάποιες στήλες τύπου double. Μέσω του DataReader (εκτελώντας Select * from odbcTablename ) και του SqlBulkCopy παίρνω το ίδιο exception: Overflow ή underFlow exception (Το exception έρχεται από τον odbc driver). Ο reader δεν μπορέι να διαβάσει τις στήλες αυτές (Δοκιμάζοντας τις διάφορες στήλες στο select query του reader ανακάλυψα ότι ευθύνονται οι double columns για το exception). Κάποια ιδέα για το πώς θα μπορούσα να διαβάσω τον πίνακα? 

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