|
Îåêßíçóå áðü ôï ìÝëïò jopil. Τελευταία δημοσίευση από το μέλος jopil στις 06-12-2012, 22:53. Υπάρχουν 10 απαντήσεις.
-
03-12-2012, 22:40
|
-
jopil
-
-
-
Μέλος από τις 18-07-2005
-
-
Δημοσιεύσεις 12
-
-
|
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
|
|
Απ: 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?
Άσχετα με το τί γράφει το κείμενο, όταν έχεις πρόβλημα με τα ελληνικά φταίνε τρία πράγματα: - Είτε αποθηκεύεις ANSI αντί για Unicode, με λάθος codepage
- Ή διαβάζεις ANSI δεδομένα με λάθος codepage
- Ή τα δεδομένα έχουν αποθηκευθεί με λάθος 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
|
-
jopil
-
-
-
Μέλος από τις 18-07-2005
-
-
Δημοσιεύσεις 12
-
-
|
Απ: 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
|
-
jopil
-
-
-
Μέλος από τις 18-07-2005
-
-
Δημοσιεύσεις 12
-
-
|
Απ: 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
|
|
Απ: 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
|
|
Απ: 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
|
-
jopil
-
-
-
Μέλος από τις 18-07-2005
-
-
Δημοσιεύσεις 12
-
-
|
Απ: 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
|
|
Απ: Problem in the Greek Characters, while in Real Time Display of real_time_DBASE_DBF_updates from inside VB.NET application
Θα μπορούσες να μοιραστείς μια βάση με δεδομένα για πειραματισμό; George J.
|
|
-
06-12-2012, 10:13
|
|
Απ: 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
|
-
jopil
-
-
-
Μέλος από τις 18-07-2005
-
-
Δημοσιεύσεις 12
-
-
|
Απ: 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
|
-
jopil
-
-
-
Μέλος από τις 18-07-2005
-
-
Δημοσιεύσεις 12
-
-
|
Απ: 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. Καλό βράδυ.
|
|
|
|
|