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

 

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

Αναγνωση dbase

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος evagelos στις 20-10-2014, 21:28. Υπάρχουν 14 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-10-2014, 14:13 75788

    Αναγνωση dbase

    Γεια σας παιδια,

    Προσπαθώ να διαβάσω ένα dbase file

    όλα καλά αλλα δεν μου εμφανίζει τα ελληνικά

    Τι πρέπει να κανω;

    DataTable YourResultSet = new DataTable();

    string strAccessConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\shares\lotus\;Extended Properties=dBase III";

    OleDbConnection yourConnectionHandler = new OleDbConnection(
     strAccessConn);      

    // Open the connection, and if open successfully, you can try to query it
    yourConnectionHandler.Open();


    if (yourConnectionHandler.State == ConnectionState.Open)
    {
     string mySQL = "select * from techtime";  // dbf table name

     OleDbCommand MyQuery = new OleDbCommand(mySQL, yourConnectionHandler);
     OleDbDataAdapter DA = new OleDbDataAdapter(MyQuery);

     DA.Fill(YourResultSet);

     yourConnectionHandler.Close();
    }

    string myString = YourResultSet.Rows[0][4].ToString();

    το string αυτό εχει τιμή:   "¦+=?? =-¦?T??-??"

    Ευχαριστώ

     

     

  •  16-10-2014, 15:18 75789 σε απάντηση της 75788

    Απ: Αναγνωση dbase

    To .NET χρησιμοποιεί Unicode, ενώ πολλές παλιές εφαρμογές χρησιμοποιούν ASCII με συγκεκριμένα codepages. Όταν ο OLE DB provider διαβάζει ASCII strings από μία βάση προσπαθεί να τα μετατρέψει σε Unicode χρησιμοποιώντας ως codepage αυτό που αντιστοιχεί στο System Locale.  Εξάλλου, και στα Regional Settings των Windows το System Locale αναφέρεται ως το codepage που χρησιμοποιείται από non-Unicode εφαρμογές. Σε περίπτωση που η βάση ορίζει κάποιο collation (γλώσσα και τρόπος ταξινόμησης), θα χρησιμοποιήσει αυτό αντί για το System Locale.

    Αν το system locale από το codepage διαφέρει από αυτό των δεδομένων, κάποιοι χαρακτήρες θα περάσουν λάθος (κινέζικα) και κάποιοι δεν μπορούν να περάσουν καθόλου και θα αντικατασταθούν με '?'.

    Για να μπορέσεις να διαβάσεις τα ελληνικά θα πρέπει πρώτα να βρεις ποιό είναι το codepage που χρησιμοποιήθηκε και μετά να το περάσεις στο connection string, αναγκάζοντας τον provider να χρησιμοποιήσει το συγκεκριμένο code page αντί για του συστήματος. Αυτό γίνεται προσθέτοντας τα Collation, CodePage ή Locale Identifier στο connection string, π.χ. ";CodePage=852"

    Τα  προβλήματα αρχίζουν αν το αρχείο είναι παλιό και χρησιμοποιεί codepages που έχουν πλέον εξαφανιστεί. Σε αυτή την περίπτωση μπορείς να διαβάσεις τα πεδία ως binary 


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  16-10-2014, 16:21 75790 σε απάντηση της 75789

    Απ: Αναγνωση dbase

    Ναι έχω δοκιμάσει διαφορα αλλα δεν δειχνουν ελληνικά

    πχ (Σε ODBC το έκανα για δοκιμη)

                DataTable YourResultSet = new DataTable();
                string strAccessConn = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=C:\shares\lotus;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;CodePage=852";
                OdbcConnection connection = new OdbcConnection(strAccessConn);
                connection.Open();
                if (connection.State == ConnectionState.Open)
                {
                    string mySQL = @"select * from C:\shares\lotus\techtime.DBF";  // dbf table name

                    OdbcCommand MyQuery = new OdbcCommand(mySQL, connection);
                    OdbcDataAdapter DA = new OdbcDataAdapter(MyQuery);

                    DA.Fill(YourResultSet);

                    connection.Close();
                }

                string myString = YourResultSet.Rows[0][4].ToString();

     

     

    Τι εννοείς σε binary;

    Ένα απλο παράδειγμα;

     

    Ευχαριστώ

  •  16-10-2014, 16:27 75791 σε απάντηση της 75790

    Απ: Αναγνωση dbase

    Μην ανακατέβεις τους provider, δεν είναι αυτοί το πρόβλημα. Τί codepage έχουν τα δεδομένα? Τί παραμέτρους χρησιμοποίησες και ποιό ήταν το αποτέλεσμα? 
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  16-10-2014, 16:45 75792 σε απάντηση της 75791

    Απ: Αναγνωση dbase

    τα δεδομένα δεν ξερω.

    εβαλα CodePage=852 , 737 , 1253,  869

    το αποτέλεσμα παλι το ιδιο. "κινεζικα"

  •  16-10-2014, 18:15 75794 σε απάντηση της 75792

    Απ: Αναγνωση dbase

    Τί κινέζικα ακριβώς ήταν? Έχει διαφορά το `?` που σημαίνει ότι ο χαρακτήρας χάθηκε από κάποιο κινέζικο που σημαίνει ότι έγινε λάθος αντιστοίχιση. Αν δεν ξέρεις ή δεν μπορέσεις να βρεις το codepage των δεδομένων δεν θα μπορέσεις να τα δείξεις.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2014, 10:23 75796 σε απάντηση της 75794

    Απ: Αναγνωση dbase

    ╠┴═╧╙ ═╔╩╧╦╧╒─╟╙

     

    αυτό μου βγάζει

  •  17-10-2014, 11:41 75797 σε απάντηση της 75796

    Απ: Αναγνωση dbase

    Για όλα τα codepages ???????????????? Τί βγάζει για το κάθε codepage? Επίσης, δοκίμασες τις άλλες παραμέτρους?

    Το καλό είναι ότι αυτοί είναι γραφικοί χαρακτήρες που σημαίνει ότι είναι δυνατή η μετατροπή από το codepage που χρησιμοποίησες χωρίς απώλεια δεδομένων. Ο OLEDB provider δέχεται και την παράμετρο CharacterSet οπότε ίσως έπρεπε να είχες δοκιμάσει και αυτό.

     Τον παλιό εκείνο καιρό (μιλάμε για DOS) για να δείξεις ελληνικά έπρεπε να φορτώσεις ελληνικούς χαρακτήρες σε "κάποιο" codepage. Τα 3ψήφια νούμερα αντιστοιχούσαν σε κωδικούς IBM, o ISO έχει τους δικούς του αριθμούς, ενώ τα Windows έχουν άλλη αρίθμηση.  Γενικά το 437 το αφήναν ήσυχο αλλά χαρακτήρες φορτώνονταν όπου ήθελες. Τυπικά στην 860, 851, 869. Αργότερα ήρθε και η 737. Ύστερα ήρθε και ο ΕΛΟΤ με το 928, το οποίο βγήκε ως ISO codepage το οποίο δεν χρησιμοποιούσε σχεδόν κανένας, το ISO 8859-7 που αντιστοιχεί στο ... 813? του οποίου οι χαρακτήρες δεν έχουν σχεδόν καμμία σχέση με τους προηγούμενους . Αν δεις τη σελίδα του Wikipedia για codepages  αναφέρονται οι 737, 851, 869 για ελληνικά. Η αντιστοίχιση που γινόταν "τότε" δεν είναι απαραίτητα η ίδια που γίνεται σήμερα. Με τα Windows, ήρθε το 1253, αλλά κάποιοι έσωζαν και στο αγγλικό, 1252. 

     Μπορείς να κάνεις δύο πράγματα, ή να κοιτάξεις ποιά είναι τα ASCII values των χαρακτήρων που επιστρέφονται και να ψάξεις να δεις σε ποιό codepage ανήκουν, ή να δοκιμάσεις με brute force να δεις ποιό code page σου γυρίζει ελληνικό string. Αν ξέρεις τί περιμένεις να βρεις σε μία εγγραφή, αυτός είναι ίσως ο πιο γρήγορος τρόπος.

    Από την άλλη, κοιτάζωντας τις σελίδες των διαφόρων codepages στο Wikipedia, (851, 869, 737) θα έλεγα ότι το μόνο που εμφανίζει ελληνικά αντί για γραφικούς χαρακτήρες είναι ... 

     

    το 813, που αντιστοιχεί στο ISO 8859-7 και η πρώτη λέξη είναι ΜΑΝΟΣ . Οι χαρακτήρες που δείχνεις είναι από το 437/737, οπότε αναρωτιέμαι πως ακριβώς έγραψες το connection string.  Αν δεις όμως τους πίνακες, τα σύβολα που αντιστοιχούν σε αυτούς τους χαρακτήρες στην 737 (204 193 205 207 211 205 201) αντιστοιχούν σε γράμματα μόνο στην 8859-7. 

    Τώρα μένει να βρεις πως να ορίσεις αυτό το codepage στο connection string. Είναι η IBM 813, ΕΛΟΤ 928, η οποία αντιστοιχεί στο Windows NLS codepage 28597. Η Windows 1253 είναι παρόμοια αλλά διαφέρει στη θέση κάποιων χαρακτήρων. Οπότε μπορεί και το κείμενο να είναι Windows-1253


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

    Απ: Αναγνωση dbase

    Το connection String το έχω έτσι:

    string strAccessConn = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=C:\shares\lotus;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;CodePage=utf8";

     

    όταν το έχω oledb και το βαζω έτσι:

    string strAccessConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\shares\lotus\;Extended Properties=dBase III;CODEPAGE=895";

    μου πετάει μηνυμα λάθους "Could not find installable ISAM."

     

    Ένα άλλο πεδίο έχει την τιμή "╩ά±Ϋ∙Ϊ▌Έύ≥ ─ύΉ▐Ϊ±ύ≥"

  •  17-10-2014, 14:37 75799 σε απάντηση της 75798

    Απ: Αναγνωση dbase

    Μην μπλέκεις τους provider. Σε ποιόν είχες βάλει codepage και πήρες τους γραφικούς χαρακτήρες? Σε αυτόν δοκίμασε με τα νούμερα που αντιστοιχούν στο ΕΛΟΤ 928, δηλαδή 928, 813, 28597. Επιπλέον, το UTF8 είναι encoding, το codepage στο οποίο αντιστοιχεί είναι το 65001. Εδώ όμως έχουμε ISO-8859-7 το οποίο δεν έχει καμμία σχέση με UTF8. 

    Το UTF8 χρησιμοποιεί 2 bytes για μή λατινικούς χαρακτήρες όπου ο πρώτος είναι ειδικό placeholder. Το κείμενο που έκανες post θα είχε το placeholder να επαναλαμβάνεται σε κάθε 2ο χαρακτήρα αν ήταν UTF8.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2014, 16:38 75800 σε απάντηση της 75799

    Απ: Αναγνωση dbase

    ειτε βάζω το ένα είτε το άλλο μου δείχνει τα ίδια.

    Αρα μαλλον δεν καταλαβαινει το connection string που του βάζω;

    string strAccessConn = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=C:\shares\lotus;Exclusive=No;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;CodePage=28597";

     

    813: "╠┴═╧╙ ═╔╩╧╦╧╒─╟╙"
    928: "╠┴═╧╙ ═╔╩╧╦╧╒─╟╙"
    28597: "╠┴═╧╙ ═╔╩╧╦╧╒─╟╙"

  •  17-10-2014, 17:15 75801 σε απάντηση της 75800

    Απ: Αναγνωση dbase

    Για τον ODBC driver οι παράμετροι είναι διαφορετικές. Δοκίμασε CHARSET αντί για CodePage
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2014, 23:01 75804 σε απάντηση της 75801

    Απ: Αναγνωση dbase

    τα ίδια:

     

    string strAccessConn = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=C:\shares\lotus;Exclusive=No;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;CHARSET=928";

     

    28597 "╠┴═╧╙ ═╔╩╧╦╧╒─╟╙"
    813 "╠┴═╧╙ ═╔╩╧╦╧╒─╟╙"
    928 "╠┴═╧╙ ═╔╩╧╦╧╒─╟╙"

     

    Ψαχνοντας στο internet για διαφορα προγραμματα, πχ dbfviewer , dbf manager, αυτά το ανοιγουν και τα βλέπουν και αυτά "κινεζικα". ΟΜΩΣ έχουν ενα κουμπί και τα δυο που λενε dos/win ή use ansi characters που τα γυρίζουν σε ελληνικά.

    επίσης χωρις να ειμαι κ ο πιο σχετικός, αλλαζοντας το charset δεν έπρεπε να αλλαζουν και τα συμβολα εστω και λιγο;

  •  20-10-2014, 11:26 75812 σε απάντηση της 75804

    Απ: Αναγνωση dbase

    Το γυρίζουν σε ελληνικά γιατί ή βάζουν το σωστό property στο connection string, ή κλείνουν εντελώς το translation. Κοιτάζοντας το Initializing the dBase Database Driver υποψιάζομαι ότι αυτό που αλλάζουν οι άλλες εφαρμογές είναι το DataCodePage το οποίο δέχεται μόνο τιμές OEM (κάνει translation) και ANSI (δεν κάνει). Αν δουλεύει το ANSI, σημαίνει ότι το system locale του μηχανήματος σου είναι Greek.

    Απ' ότι βλέπω, ο dBase ODBC Driver απλά αγνοεί σχεδόν όλα τα settings πέρα από αυτά που ορίζονται σε αρχεία ή registry settings. Δοκίμασε να προσθέσεις το αρχείο μέσω του "Data Sources (ODBC)" στο Control Panel για να δεις ποιοί drivers έχουν εγκατασταθεί και ποιές ρυθμίσεις υποστηρίζουν. 


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-10-2014, 21:28 75815 σε απάντηση της 75812

    Απ: Αναγνωση dbase

    Ναι αυτό ηταν,

    πηγα στην registry εδω: HKLM\Software\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage

    και έβαλα ansi απο oem

    και τελευταια ερώτηση.

    Μπορώ να το κάνω αυτό στο runtime;

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