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

 

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

Datatable.Select() και Ελληνικά

Îåêßíçóå áðü ôï ìÝëïò geochatz. Τελευταία δημοσίευση από το μέλος Χρήστος Γεωργακόπουλος στις 18-10-2005, 14:45. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-10-2005, 00:45 6224

    Datatable.Select() και Ελληνικά

    Θα ήθελα τα φώτα σας στο παρακάτω πρόβλημα μου.

    Έχω ένα Datatable το οποίο το έχω γεμίσει με εγγραφές απο ένα SQL Server. Ας υποθέσουμε ότι έχει μέσα τις παρακάτω εγγραφές (rows)

    Γιώργος
    Γιάννης
    Κώστας

    Στην συνέχεια κάνω

    DataRow[] drs ;

    drs = dt.Select(" name like 'γιωργος' ");


    Αυτό λογικά θα μου φέρει ένα Array με τις εγγραφές που ικανοποιούν το παραπάνω κριτήριο. Το θέμα μου τώρα είναι αν μπορώ με κάποιο τρόπο να πω στο Framework να φέρει τις εγγραφές είτε είναι στα κεφαλαία γραμμένες, είτε έχουν τόνους, είτε είναι σε πολυτονικό σύστημα. Και για γίνω περισσότερο κατανοητός εννοώ δίνοντας

    drs = dt.Select(" name like 'γιωργος' ");

    να μου φέρνει την εγγραφή "Γιώργος".

    Only two things are infinite, the universe and the human stupidity, and I'm not sure about the former.

    Albert Einstein - US (German-born) physicist (1879 - 1955)
  •  18-10-2005, 00:53 6225 σε απάντηση της 6224

    Απ: Datatable.Select() και Ελληνικά

    Collation = Greek, case insensitive + accent insensitive = CI - AI
    Βρέπει να είναι σίγουρα τα πεδία με αυτό το collation, νομίζω και η βάση το ίδιο.
    Χρήστος Γεωργακόπουλος
  •  18-10-2005, 10:48 6230 σε απάντηση της 6224

    Απ: Datatable.Select() και Ελληνικά

    Αν η κλήση γινόταν σαν SQL στη database θα δούλευε το collation και θα μπορούσες να γράψεις:
    SELECT * FROM mytable WHERE name=('γιωργος' COLLATE Greek_CI_AI )
    για να αγνοήσει κεφαλαία ή
    SELECT * FROM mytable WHERE name=('γιωργος' COLLATE Greek_CS_AI )
    για να αγνοήσει μόνο τόνους

    Εδώ όμως έχουμε DataTable όχι Database. Το DataTable είναι ένα αντικείμενο στη μνήμη το οποίο δεν διατηρεί καμμία σύνδεση με κάποια database, ούτε είναι το ίδιο βάση. Το Select του DataTable δυστυχώς δεν υποστηρίζει accent-insensitive αναζητήσεις, οπότε θα πρέπει να αρκεστείς στο like 'γι*ργος'.

    Μπορείς όμως να κάνεις ένα loop σε όλες τις γραμμές για να βρεις αυτές που θέλεις. Στην περίπτωση που δεν υπάρχει κάποιο index στο name, η ταχύτητα θα είναι η ίδια.
    Τώρα πως, θα κάνεις accent-insensitive σύγκριση σε string, αυτό είναι άλλο πρόβλημα. Ακόμα δεν έχω βρει κάποιο να πείσω το String.Compare('γιώργος','γιωργος') να επιστρέψει 0 (ότι δηλαδή οι τιμές είναι ίδιες).
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-10-2005, 12:06 6231 σε απάντηση της 6230

    Απ: Datatable.Select() και Ελληνικά

     pkanavos wrote:
    Τώρα πως, θα κάνεις accent-insensitive σύγκριση σε string, αυτό είναι άλλο πρόβλημα. Ακόμα δεν έχω βρει κάποιο να πείσω το String.Compare('γιώργος','γιωργος') να επιστρέψει 0 (ότι δηλαδή οι τιμές είναι ίδιες).

    Και γιατί δεν φτιάχνεις κάτι σαν:




    Private Function ToLowerRemoveAccent(ByVal s As String) As String
            Dim sb As New System.Text.StringBuilder(s.ToLower)


            sb.Replace("ά", "α")
            sb.Replace("ώ", "ω")
            sb.Replace("έ", "ε")
            sb.Replace("ί", "ι")
            sb.Replace("ύ", "υ")
            sb.Replace("ό", "ο")
            sb.Replace("ϊ", "ι")
            sb.Replace("ϋ", "υ")


            Return (sb.ToString)


        End Function

    Οπότε να κάνεις String.Compare(ToLowerRemoveAccent(string1), ToLowerRemoveAccent(string2)) ?

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  18-10-2005, 12:11 6232 σε απάντηση της 6230

    Απ: Datatable.Select() και Ελληνικά

    Γιατί αυτό είναι χακιά! Αυτό θα αναγκαστώ να το κάνω επειδή δεν μπορώ να ορίσω κάποιο CompareOptions το οποίο θα αγνοεί τους τόνους
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-10-2005, 13:05 6235 σε απάντηση της 6224

    Απ: Datatable.Select() και Ελληνικά

    Το βρήκα! Ας είναι καλά ο Michael Kaplan , που στο άρθρο του "String.Compare is for Sissies"  έχει την αντιστοιχία μεταξύ των comparison constants των Windows 2000 και του SQL Server. Ανακαλύπτουμε λοιπόν, ότι το flag που αγνοεί τους τόνους είναι το ... CompareOptions.IgnoreNonSpace ?

    Tέλος πάντων, περνώντας αυτό επιτέλους η CompareInfo.Compare επιστρέφει 0!

    CultureInfo.CurrentCulture.CompareInfo.Compare(strTest, strTest2,CompareOptions.IgnoreNonSpace)==0

    Έτσι θα δουλέψει η αναζήτηση σε loop αλλά το DataTable.Select δεν δουλεύει. Ο λόγος είναι ότι δεν μπορεί να ορίσει κανείς CompareOptions για το select ή το DataTable, ούτε για το CultureInfo που χρησιμοποιεί το thread, ούτε για το Locale property του DataSet!

    Σημείωση: Ούτε με το String.Compare δουλεύει!


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-10-2005, 14:45 6237 σε απάντηση της 6225

    Απ: Datatable.Select() και Ελληνικά

     cgeo wrote:
    Collation = Greek, case insensitive + accent insensitive = CI - AI
    Βρέπει να είναι σίγουρα τα πεδία με αυτό το collation, νομίζω και η βάση το ίδιο.

    Ουπς, λάθος... νόμιζα ότι ήταν στη βάση....


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