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

 

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

Γαλλικά σε sql data base

Îåêßíçóå áðü ôï ìÝëïò anthou. Τελευταία δημοσίευση από το μέλος anthou στις 23-10-2012, 23:09. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-10-2012, 21:57 71461

    Γαλλικά σε sql data base

    Στο site  μπορώ να κάνω update  και insert  στην βάσηγράφωντας  είτε με ελληνικά είτε αγγλικά  η γαλλικά χωρίς κανένα πρόβλημα
    Οταν όμως κανω την σύνδεση και γράφω κώδικα στην VB 2010 για να κάνω update  η  insert στην βάση που βρίσκεται στον hosting
    τότε έχω πρόβλημα όταν γράφω Γαλλικά καθώς στην βάση η εγγραφή γίνεται με αλλοίωση των χαρακτήρων
    παράδειγμα

    nlexi="éçàê"
      zxc = "insert into lexis_master(ltajis_cod,Lklidi,lexis,profora,metafrasi,Lenergo,Lindex,epipedo) " & _
                     "values('" & ncode & "','" & nklidi & "','" & nlexi & "','" & nprofora & "','" & nmetafrasi & "'," & _
                     "'" & nenergo & "','" & nindex & "','" & nepipedo & " ')"
                connection.Open()
                sqladapter.InsertCommand = New SqlCommand(zxc, connection)
                sqladapter.InsertCommand.ExecuteNonQuery()
                connection.Close()
    Η καταχώρηση στην βάση δείχνει το πεδίο lexis="acae"  χωρίς τους τόνους
    To ίδιο αποτέλεσμα έχω και όταν γράφω στην βάση του pc μου
    Το collation στην βάση είναι greek_ci_as
    δηλαδή ο μόνος τρόπος σωστής ενημέρωσης είναι μόνο απο το web
    εχει σχέση με την VB η με τον sql ?
    Μπορεί κάποιος να βοηθήσει στην λύση του προβλήματος

  •  23-10-2012, 13:10 71463 σε απάντηση της 71461

    Απ: Γαλλικά σε sql data base

    Το πρόβλημα είναι ο κώδικας, όχι η βάση ή η γλώσσα.

    Ο SQL Server δεν χρειάζεται κάτι ιδιαίτερο για να αποθηκεύσει ελληνικά, γαλλικά ή κυριλλικά - αν τα στείλεις ως unicode. Αυτό σημαίνει ότι τα πεδία που χρησιμοποιείς πρέπει να είναι nvarchar, το string που στέλνεις να είναι nvarchar και να το στέλνεις ως Unicode (p.x. Ν'το sting μου') αντί για ASCII string. Το collation δεν παίζει κανένα ρόλο αν χρησιμοποιείς Unicode. Αν όμως προσπαθήσεις να αποθηκεύσεις σε varchar (δηλαδή ASCII) πεδίο ή στείλεις τα string με μορφή ASCII, το collation θα χρησιμοποιηθεί ως το codepage του string. Προφανώς αν το collation είναι διαφορετικό από αυτό που νομίζεις, θα έχεις πρόβλημα.

    Στην περίπτωση σου το string concatenation που χρησιμοποιείς προκαλεί πολλά προβλήματα: ασφάλειας (λόγω sql injection), ταχύτητας (επειδή αναγκάζεις τον server να κάνει συνέχεια parse ένα query που μπορεί να έχει ξανασυναντήσει) και τέλος, στέλνεις τα sting ως ASCII. Επιπλέον, αν τα πεδία σου δεν είναι nvarchar, θα έχεις πρόβλημα.

    Ο σωστός τρόπος είναι να φτιάξεις ένα parameterized query και να περάσεις έτσι τα string. Με τον τρόπο αυτό αποκλείεται η πιθανότητα sql injection, ο server θα ξαναχρησιμοποιήσει το ίδιο execution plan κάθε φορά ακόμα και αν αλλάξουν οι παράμετροι και δεν θα χρειαστεί να μαντέψει ούτε να κάνει καμμία μετατροποπή μεταξύ codepages:

            Dim sql As String = "insert into lexis_master(ltajis_cod,Lklidi,lexis,profora,metafrasi,Lenergo,Lindex,epipedo) " &
                            " values(@ltajis_cod,@Lklidi,@lexis,@profora,@metafrasi,@Lenergo,@Lindex,@epipedo)"
            Using connection = New SqlConnection("some connenction string")
                Using cmd = New SqlCommand(sql, connection)
                    cmd.Parameters.AddWithValue("@ltajis_cod", "aaa")
                    cmd.Parameters.AddWithValue("@Lklidi", "bbb")
                    cmd.Parameters.AddWithValue("@lexis", "ccc")
                    cmd.Parameters.AddWithValue("@profora", "sdfsfs")
                    cmd.Parameters.AddWithValue("@metafrasi", "sdfs")
                    cmd.Parameters.AddWithValue("@Lenergo", "sdsds")
                    cmd.Parameters.AddWithValue("@Linde", "sdfsd")
                    cmd.Parameters.AddWithValue("@epipedo", "sdfsdfsd")
    
    		connection.Open()
                    cmd.ExecuteNonQuery()
                End Using
            End Using

    Το καλό με τα parameters είναι ότι με τον ίδιο τρόπο μπορείς να περάσεις και αριθμούς και ημερομηνίες χωρίς να τα μετατρέψεις σε string, οπότε δεν έχεις πονοκεφάλους για το πως θα περάσει η υποδιαστολή ή πως γράφεται μία ημερομηνία στην Αμερική ή την Ελλάδα. Τέλος, δεν υπάρχει καμμία απολύτως ανάγκη να χρησιμοποιήσεις κάποιo SqlAdapter.

    Εγκυκλοπαιδικά τέλος, για να εισάγεις ένα unicode string σε μία εντολή T-SQL πρέπει να βάλεις μπροστά από το string το γράμμα N. Θα πρέπει δηλαδή να γράψεις ... where somefield = Ν'τα ελληνικά μου' ή Values (N'κι άλλο ελληνικό',N'...'). Αυτό πρέπει να το θυμάσαι όταν γράφεις π.χ. εντολές στο Management Studio. Στον κώδικα πρέπει πάντα να χρησιμοποιείς parameterized queries.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-10-2012, 23:09 71465 σε απάντηση της 71463

    Απ: Γαλλικά σε sql data base

    Σε ευχαριστώ έκανα δοκιμή και δουλεύει 
    Το ίδιο πιστεύω οτι ισχύει και για το update

      Dim asd, ert As String
            asd = "éèçê"
            ert = 2.34
           
            Dim sql As String = "update lexis_master set lexis=@lexis,metafrasi=@metafrasi " & _
                 "where ltajis_cod='111113' "
            Using connection = New SqlConnection(connectionString)
                Using cmd = New SqlCommand(sql, connection)
                    cmd.Parameters.AddWithValue("@lexis", asd)
                    cmd.Parameters.AddWithValue("@metafrasi", ert)
                    connection.Open()
                    cmd.ExecuteNonQuery()
                End Using
            End Using

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