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

 

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

Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

Îåêßíçóå áðü ôï ìÝëïò jopil. Τελευταία δημοσίευση από το μέλος jopil στις 06-12-2012, 22:53. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-12-2012, 22:40 71658

    Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Μια DBF από CLIPPER-V DBASE δομή, ενημερώνεται με γύρω στα 150 σήματα ανά δευτερόλεπτο από ένα σύστημα DAQ Telemetry, μέσα από ένα dot.NET client_server socket, του οποίου τα messages τα "ρουφάει" μiα legacy CLIPPER-V εφαρμογή και τα κάνει display σε real_time σε ένα δίκτυο από 7 PCs, που τρέχουν επίσης μία CLIPPER Browse_Object εφαρμογή. Η παρουσίαση των σημάτων γίνεται με δυναμικό συνδυασμό επεξηγήσεών τους, απο συσχετιζόμενες βάσεις με Ελληνικά μηνύματα και τα τελικά record πάνε σε δύο master DBFs και τα βλέπουν όλοι real_time. Ως εδώ όλα δουλεύουν άψογα επί 17 χρόνια και μέσα από μία κλίμακα συνεχών βελτιώσεων και επεκτάσεων, όλο το περιβάλλον έχει περάσει σταδιακά σε ένα παράλληλο SQL σύστημα, όπου όμως όλα τα μηνύματα είχαν  ξαναγραφτεί στα Ελληνικά μέσα στα νέα table. Το παλαιό όμως σύστημα εξακολουθεί να λειτουργεί σε κάτι παρπάνω από άψογο mode και έτσι επεχείρησα να περάσω ένα OLEDB set of calls σε αυτό το σύστημα των DBF για απ' ευθείας display των δεδομένων σε windows forms. Με Encoding.GetEncoding(0) /default  στην είσοδο και 737 στο display στην έξοδο, στο textbox, όλοι οι χαρακτήρες πέρασαν καλά, εκτός από το Ελληνικά Ι & Ν που τους δίνει σαν ?,  το Λ που το δίνει σαν S και το Ν που το δίνει σαν Ζ. Έλεγξα χαρακτήρα-χαρακτήρα σαν bytes, και έδινε πραγματικά τα αντίστοιχα νούμερα από τον 256_άρι πίνακα, για το ? ,το S και το Ζ. Το έκανα με ODBC, ...το ίδιο. Το έκανα με ADO.NET.....το ίδιο. Τα MDAC είναι όλα τα τελευταία 2.81.nn.nn. Δοκίμασα σε XP, το ίδιο, σε WIN-7, το ίδιο, σε Server-2008.... το ίδιο. Με τα codepages όλα στα Ελληνικά. Πάντα το ίδιο πρόβλημα. Ta look_up tables ούτε που τα σκέφτομαι σαν λύση. Υπάρχει κάτι που δεν παίζει καλά στο MDAC για τα Ελληνικά? Υπάρχει κάποιος άλλος driver, ή class που μπορεί να κάνει την ίδια δουλειά σωστά ? Ευχαριστώ.

     

  •  04-12-2012, 10:42 71662 σε απάντηση της 71658

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Σε παρακαλώ σπάσε το κείμενο σε προτάσεις και παραγράφους γιατί είναι αδύνατον να το διαβάσει κανείς. Δοκίμασα να το κάνω εγώ αλλά μου φαίνεται ότι κάθε πρόταση είναι ολόκληρη παράγραφος. Κάτι διάβασα για Clipper, κάτι για SQL αλλά δεν κατάλαβα τελικά τί θέλεις να κάνεις. Να μεταφέρεις ελληνικό κείμενο από Clipper σε κάποια άλλη βάση? Τί βάση είναι? SQL Server, Oracle, MySQL?

    Άσχετα με το τί γράφει το κείμενο, όταν έχεις πρόβλημα με τα ελληνικά φταίνε τρία πράγματα: 
    1. Είτε αποθηκεύεις ANSI αντί για Unicode, με λάθος codepage
    2. Ή διαβάζεις ANSI δεδομένα με λάθος codepage
    3. Ή τα δεδομένα έχουν αποθηκευθεί με λάθος codepage, π.χ. ελληνικά αποθηκεύτηκαν σε βάση με αγγλικό codepage
    Τί δεν δίνει λύση :
    • Η αλλαγή βιβλιοθηκών δεν πρόκειται να σε βοηθήσει καθώς δεν είναι οι βιβλιοθήκες που φταίνε. 
    • Το ότι η εφαρμογή σε clipper δουλεύει τόσο καιρό επίσης δεν λέει τίποτε. Οι παλιότερες εφαρμογές δεν καταλαβαίνανε από codepages και ουσιαστικά βασίζονταν στο ότι τα bytes που στέλνανε στην οθόνη αντιστοιχούσαν σε κάποιο χαρακτήρα στο character set της κάρτας.
    • Η μετατροπή "με το χέρι" χρησιμοποιώντας την Encoding επίσης δεν θα δουλέψει. Τα δεδομένα που τραβάς σε μορφή string έχουν ήδη μετατραπεί σε Unicode από τον driver. Αν βλέπεις '?' σημαίνει ότι ο driver απέτυχε να μετατρέψει τα δεδομένα. Μόνο αν τα τραβήξεις ως blob θα μπορέσεις να κάνεις κάποια μετατροπή από byte[] σε string

    Η λύση για το #1 πάντα είναι να αποθηκεύεις τα δεδομένα σε Unicode μορφή (nvarchar στον SQL Server). 

    Η λύση για το #2 είναι να βρεις ποιό είναι το σωστό codepage και να το ορίσεις ως παράμετρο στον driver που χρησιμοποιείς για να διαβάσεις. Το πως θα το κάνεις είναι θέμα του driver που χρησιμοποιείς, όχι της βιβλιοθήκης.
    Σε κάποιους driver το #2 δεν πρέπει να συμβαίνει αν τo codepage της βάσης είναι σωστό. Για παράδειγμα, ο SQL Server κάνει αυτόματα μετατροπή από το codepage της βάσης με την κατάλληλη παράμετρο.

    Στο #3, έχεις μπλέξει.  Η βάση λέει π.χ. ότι το κείμενο είναι αγγλικό αλλά στέλνει ελληνικούς χαρακτήρες οπότε ο καημένος ο driver τα χάνει και αντικαθιστά με ? τους χαρακτήρες που δεν μπορεί να κάνει map. Εδώ πρέπει να απενεργοποιήσεις την αυτόματη μετατροπή αν υπάρχει, να βρεις (μάλλον, να μαντέψεις) ποιός είναι ο συνδυασμός codepage (π.χ. αγγλικό στη βάση προς ελληνικό στον κώδικα ή το αντίστροφο) και να τραβήξεις τα δεδομένα.

    Δυστυχώς, και αυτό το θέμα εξαρτάται από τον driver. Αν ο driver π.χ. διαβάζει ΜΟΝΟ το system locale και δεν σου επιτρέπει να δώσεις το δικό σου codepage, θα πρέπει να αλλάξεις το locale του server σου για να ταιριάξει με αυτό που περιμένει η εφαρμογή. Ο driver της Oracle είναι μία κλασσική περίπτωση που δεν καταλαβαίνει από locales, ενώ οι drivers για DB2 σε AS400 θέλουν σκάλισμα για να καταφέρεις τη σωστή μετατροπή


    Για να βγάλουμε άκρη, χρειάζεται να μας πεις το λιγότερο τα παρακάτω:
    • Ποιούς driver χρησιμοποιείς για να μιλήσεις στο Clipper? Απ' όσο θυμάμαι ήταν ελαχιστότατοι οι OLEDB drivers που καταλαβαίνανε από Clipper
    • Σε τί βάση προσπαθείς να αποθηκεύσεις?
    • Σε τί τύπου πεδία αποθηκεύεις? Varchar, Nvarchar? Και αν είναι varchar, τί collation έχεις ορίσει στον πίνακα ή τη βάση?

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  04-12-2012, 12:27 71665 σε απάντηση της 71662

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Παναγιώτη γειά χαρά και σ' ευχαριστώ. (Έχουμε βρεθεί σε MS events)

    Κατ' αρχήν ο CLIPPER είναι μία πρώιμη αντικειμενοστρεφής γλώσσα προγραμματισμού και δεν σχετίζεται με το πώς

    αποθηκεύονται τα δεδομένα, ούτε χρησιμοποιεί κάποιον ειδκό driver.  Δεν "μιλάω" με CLIPPER σε καμία περίπτωση.

    Οι βάσεις των εφαρμογών είναι σε  DBF και όταν τις διαβάσω με EXCEL, τα πάντα έρχονται και εμφανίζονται μιά χαρά

    σε οποιοδήποτε  PC, είτε με XP, είτε με 7.  Το πρόβλημα με αυτούς τους 4 συγκεκριμένους ΚΕΦΑΛΑΙΟΥΣ χαρακτήρες

    και άλλους 6 μικρούς, εμφανίζεται  ΜΟΝΟ όταν τα τραβήξω με OLEDB ή ODBC ή ADO μέσα από VB.NET.  Φαντάζομαι

    ότι αν υπήρχε πρόβλημα με codepages, θα ήταν για όλους τους χαρακτήρες και δεν θα μπορούσα ούτε από EXCEL να

    τα δώ. Αν θές μπορώ να σου στείλω σε ένα zip τα code_snippet και μία DBF με μερικά record να το διαπιστώσεις και μόνος

    σου. Επίσης, ΔΕΝ ΑΠΟΘΗΚΕΥΩ σε αυτή την φάση κάτι οπουδήποτε. Απλά διαβάζω την DBF και παρουσιάζω τα δεδομένα

    στο textbox.  Αυτό έιναι όλο. Ευχαριστώ, Γιάννης

  •  04-12-2012, 12:45 71666 σε απάντηση της 71662

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Να σημειώσω επίσης, ότι στο ίδιο το παραθύρι textbox που εμφανίζονται οι λάθος

    φερμένοι χαρακτήρες αφού τρέξει η κλήση, εάν με alt-128 έως alt-175 καλέσω

    τους Ελληνικούς χαρακτήρες από το extented map,  όλοι οι χαρακτήρες εμφανίζονται

    ΚΑΝΟΝΙΚΑ, και οι μεγάλοι και οι μικροί. Γιάννης

  •  04-12-2012, 13:37 71667 σε απάντηση της 71665

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Γνωρίζω τί είναι η Clipper και δεν είναι μόνο η γλώσσα, αλλά αλλάζει και ελαφρά ο τρόπος αποθήκευσης. Πέρα από τα dbf χρησιμοποιούνται και τα ndx αρχεία για τα index, τα οποία δεν αναγνωρίζονται απαραίτητα από drivers για DBase. Το αποτέλεσμα είναι ότι ακόμα και αν μπορείς να διαβάσεις τα δεδομένα, η πρόσβαση είναι πολύ αργή.

    Το "απλά δείχνω σε textbox" δεν είναι απλή διαδικασία. Τα string στο .NET είναι Unicode οπότε έχει ήδη γίνει μετατροπή από ASCII σε Unicode. Δεν θυμάμαι αν η DBase υποστήριξε ποτέ Unicode, αλλά είμαι σχεδόν σίγουρος ότι στην περίπτωση σου μιλάμε για ASCII δεδομένα. Συνεπώς, έχει σημασία να δεις ποιόν driver χρησιμοποιείς και τί ρυθμίσεις δέχεται

    Ακόμα δεν είπες ΠΟΙΟΝ driver χρησιμοποιείς στον κώδικα σου. Δεν υπάρχει out-of-the-box OLEDB ή ADO.NET driver για dBase. Μήπως χρησιμοποίησες τον ODBC driver? Ποιό είναι το connection string που χρησιμοποίησες? 

    Έχει σημασία να δεις τί options σου δίνει ο driver για να δεις αν μπορείς να βγάλεις άκρη με κάποιο δωρεάν ή θα πρέπει να αγοράσεις κάποιον third party


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  04-12-2012, 13:54 71668 σε απάντηση της 71667

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Αν χρησιμοποίησες τον Jet driver, αξίζει να δεις αυτό το post στο StackOverflow. Μπορείς να προσθέσεις τα Collate, Codepage properties στο Connection string ή να κατεβάσεις τον OLEDB Driver για FoxPro
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  04-12-2012, 14:01 71669 σε απάντηση της 71667

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Δεν είναι σαφές, πώς όταν λέω ότι χρησιμοποιώ κώδικα VB.NET, ότι οι driver είναι του .NET ?

    Στο πρώτο post, είπα MDAC. Και τα ίδια φαινόμενα παρουσιάζονται είτε στο VB-2005, είτε

    στο VB-2012. Δεν υπάρχουν ndx αρχεία. Δεν χρησιμοποιούνται παρά μόνο:

    α) ένα DBF και

    β) ένα VB.NET source που διαβάζει αυτό το DBF

    ΚΩΔΙΚΑΣ:

    ***********************************************************************

    Imports System.io

    Imports System.Data.OleDb

    Imports System.Data.OleDb.OleDbConnection

    Imports System.Data.Odbc

    Imports System.Data.Odbc.OdbcConnection

    Public Class Form1

    Dim command As OdbcCommand

    Dim dr As OdbcDataReader

    Dim connection As OdbcConnection

    Dim connectionString As String = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=d:\station;"

    Dim sql As String = "SELECT * FROM ALARMS WHERE DISPATCH LIKE '?'"

    Dim command1 As OleDbCommand

    Dim dr1 As OleDbDataReader

    Dim connection1 As OleDbConnection

    Dim connectionString1 As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\STATION; Extended Properties=dBase III"

    Dim sql1 As String = "SELECT * FROM ALARMS WHERE DISPATCH  LIKE '?' "

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim counter As Integer = 0

    connection1 = New OleDbConnection(connectionString1)

    connection1.Open()

    command1 = New OleDbCommand(sql1, connection1)

    dr1 = command1.ExecuteReader

    Dim locstring As Byte()

    Dim strModified As String = ""

    While (dr1.Read())

    locstring = System.Text.Encoding.GetEncoding(0).GetBytes(dr1.GetValue(4).ToString())

    strModified = System.Text.Encoding.GetEncoding(737).GetString(locstring)

    TextBox1.AppendText(dr1.GetValue(0).ToString() & " " & dr1.GetValue(1).ToString().Substring(0, 10) & " " & _

    dr1.GetValue(2).ToString() & " " & dr1.GetValue(3).ToString() & " " & _

    strModified.PadRight(49, " ") & _

    dr1.GetValue(5).ToString() & vbCrLf)

    'dr1.GetValue(4).ToString().PadRight(49, " ") & _

    counter += 1

    If counter = 1000 Then

    Exit While

    End If

    End While

    connection1.Close()

    dr1.Close()

    command1.Dispose()

    connection1.Dispose()

    TextBox1.AppendText(vbCrLf & " END " & vbCrLf)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    Dim counter As Integer = 0

    connection = New OdbcConnection(connectionString)

    connection.Open()

    command = New OdbcCommand(sql, connection)

    dr = command.ExecuteReader

    Dim locstring As Byte()

    Dim strModified As String = ""

    While (dr.Read())

    locstring = System.Text.Encoding.GetEncoding(0).GetBytes(dr.GetValue(4).ToString())

    strModified = System.Text.Encoding.GetEncoding(737).GetString(locstring)

    TextBox1.AppendText(dr.GetValue(0).ToString() & " " & dr.GetValue(1).ToString().Substring(0, 10) & " " & _

    dr.GetValue(2).ToString() & " " & dr.GetValue(3).ToString() & " " & _

    strModified.PadRight(49, " ") & _

    dr.GetValue(5).ToString() & vbCrLf)

    'dr.GetValue(4).ToString().PadRight(49, " ") & _

    counter += 1

    If counter = 5 Then

    Exit While

    End If

    End While

    connection.Close()

    dr.Close()

    command.Dispose()

    connection.Dispose()

    TextBox1.AppendText(vbCrLf & " END " & vbCrLf)

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

    Dim counter As Integer = 0

    Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\station;Extended Properties=dBase IV"

    Dim objConn As New System.Data.OleDb.OleDbConnection(sConnectionString)

    objConn.Open()

    Dim da As New System.Data.OleDb.OleDbDataAdapter("Select * from alarms WHERE DISPATCH LIKE '?'", objConn)

    Dim ds As New DataSet("temporal")

    da.Fill(ds, "temporal")

    Dim dt As DataTable = ds.Tables("temporal")

    Dim drCurrent As DataRow

    For Each drCurrent In dt.Rows

    TextBox1.AppendText(drCurrent(0).ToString & " " & _

    drCurrent(1).ToString.Substring(0, 10) & " " & _

    drCurrent(2).ToString & " " & _

    drCurrent(3).ToString & " " & _

    drCurrent(4).ToString & " " & _

    drCurrent(5).ToString & vbCrLf)

    Dim mystr As String = ""

    For Each mystr In drCurrent(4).ToString

    TextBox1.AppendText(Asc(mystr) & " ")

    Next

    counter += 1

    If counter = 1 Then

    Exit For

    End If

    Next

    objConn.Close()

    TextBox1.AppendText(vbCrLf & " END " & vbCrLf)

    End Sub

    End Class

    ****************************************************** ΚΑΙ Η ΑΠΑΝΤΗΣΗ ******************

    23E4 01/11/2012 00:29 0 ΔΕ? ΕΧΕ? ΕΡΘΕ? ΣΗΜΑ ΑΠZ -> 30/10/12 - 17.33-     ?
    2ED5 01/11/2012 00:29 0 ΔΕ? ΕΧΕ? ΕΡΘΕ? ΣΗΜΑ ΑΠZ -> 30/10/12 - 17.46-     ?
    CB76 01/11/2012 00:29 0 ΔΕ? ΕΧΕ? ΕΡΘΕ? ΣΗΜΑ ΑΠZ -> 30/10/12 - 17.48-     ?
    DD42 01/11/2012 00:29 0 ΔΕ? ΕΧΕ? ΕΡΘΕ? ΣΗΜΑ ΑΠZ -> 30/10/12 - 17.50-     ?

  •  05-12-2012, 23:18 71682 σε απάντηση της 71669

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Θα μπορούσες να μοιραστείς μια βάση με δεδομένα για πειραματισμό;

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  06-12-2012, 10:13 71688 σε απάντηση της 71682

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    George J. Capnias:

    Θα μπορούσες να μοιραστείς μια βάση με δεδομένα για πειραματισμό;

     

    George J.


    Συμφωνώ και επαυξάνω. Έστω 2-3 rows που να δείχνουν το πρόβλημα.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  06-12-2012, 22:43 71702 σε απάντηση της 71688

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Παίδες, καλησπέρα. Μόλις τώρα μπήκα πάλι στο f.  Κανένα πρόβλημα. Αύριο σας στέλνω ένα dbf με όσα record θέλετε.

    Απλά, αν έχετε την καλοσύνη, στείλτε μου στο [email protected] τα e-mail σας, μη τα βάζω στον αέρα.  Ούτως ή άλλως

    ελάχιστοι θα ενδιαφερόντουσαν. Άμα βγεί αποτέλεσμα, τα βάζουμε όλα πακέτο στο forum για όποιον πατριώτη τα χρειαστεί

    στο μέλλον. Καλό βράδυ & ευχαριστώ. Γ.Π.

     

  •  06-12-2012, 22:53 71704 σε απάντηση της 71702

    Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application

    Επίσης, άμα κανάς φίλος παιδεύεται με MODBUS, έχω "χειροπρακτικό" υλικό γραμμένο από καιρό, διαθέσιμο σε έκαστη ζήτηση. Επίσης για εργαστηριακές

    γεννήτριες Velleman, αλλά και για WAVECOM fastrack modules, για αυτόματη αποστολή SMS. Ωσαύτως και ένα ασύγχρονο multi-tuti GPRS server_άκο

    για SIA-IP πρωτόκολλο, αλλά και για free parsing. Καλό βράδυ.

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