Laden...

Wie SQL Server Varchar Wert mit Umlauten in C# String umformen?

Erstellt von mikefried vor 13 Jahren Letzter Beitrag vor 13 Jahren 14.953 Views
M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren
Wie SQL Server Varchar Wert mit Umlauten in C# String umformen?

Hallo an Alle!

ich muss eine Datenbankabfrage auswerten. Diese Abfrage wird an einen Microsoft SQL Server gestellt. Die Spalte mit den Daten beinhaltet die Straßennamen der Adressen. Wie im deutschen üblich, beinhalten die Straßennamen ja auch umlaute...

In der Datenbank sind die Umlaute noch vorhanden. Wenn ich aber die Abfragewerte in einen string umwandle, werden die Umlaute durch ein "?" ersetzt.

Hier mal mein code:



  using (SqlConnection connection = new SqlConnection(GetConnectionString()))
             
            {
                using (SqlCommand command = new SqlCommand("mb_bdb_p_addressdata", connection))
                {

                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.Parameters.Add(new SqlParameter("@pC_name", name));

                    connection.Open();

                    SqlDataReader reader = command.ExecuteReader();
  
                    while (reader.Read())
                    {
 
                        result.Name = reader["street"].ToString();
 
                    }
 
                    connection.Close();
                }
            }

Wenn ich mir nun den string aus result.Name ausgeben lasse wird der Wert zum Beispiel "Bl?tenstra?e" ausgegeben.

Wie kann ich die Ausgabe/Zeichen richtig in einen C# string umwandeln?

Für einen Tipp bin ich sehr Dankbar!

Gruß Mike

S
18 Beiträge seit 2010
vor 13 Jahren

Hallo Mike,

das ist nicth das normale Verhalten bei einer SQL-Verbindung. Infolgedessen solltest du/müssen wir uns Gedanken darüber machen, was in deiner Umgebung speziell ist. Bitte gib uns mehr Informationen über:

Die verwendete SQL-Server-Version
Die installierte SQL-Client-Version
Die Version der Laufzeitumgebung (.NET)
Besondere Zeichensätze an der SQL-Datenbank
installierte Locales an deinem Client-PC

etc.

Danke!

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

als Laufzeitumgebung habe ich ein VisualStudio 2010 c# Projekt für einen WebService.Das heist die gespeicherte Datenbankprozedur mb_bdb_p_addressdata wird in einer Methode meines WebServices aufgerufen. Als Laufzeitumgebung habe ich .Net 3.5. Dieser WebService wird auf einem IIS7 gehostet.

Über die Datenbank kann ich nicht so viel sagen. Ich habe nicht so viel Erfahrung mit Datenbanken. Es ist wohl eine Mircosoft SQL server DB.

um mir die DB inhalte anzuzeigen verwende ich das Microsoft SQL Server ManagementStudio. Wie ich mit diesem Programm die Informationen zu Datenbank rausbekomme weis ich zZ nicht.

gruss Mike

C
2.122 Beiträge seit 2010
vor 13 Jahren

Müsste es vielleicht nvarchar sein?

X
1.177 Beiträge seit 2006
vor 13 Jahren

huhu,

Müsste es vielleicht nvarchar sein?

muss nicht, kann aber. In der Tat ist nvarchar unicode und varchar abhängig von der Einstellung in Server, Datenbank, Tabelle, Feld. Lässt sich bei allem per Collate einstellen.

Überprüf bitte, ob die Daten vom Webservice richtig kommen (z.B. per Fiddler) und der Client das ruiniert oder ob am Webservice eine Änderung vorgenommen werden muss.

Prinzipiell sollte man die "String-Spalten" am DB-Server auf Unicode umstellen, sonst wirds auch nix mit griechisch, türkisch oder gar chinesisch.

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

Also erst mal vielen Dank für Eure Tipps.

Die Datenbank kann ich nicht ändern! Ich muss irgendwie die Abfrage so ändern das ich diese dann in C# richtig bekomme? Ich könnte also nur die gespeicherte Prozedur in der Datenbank ändern.

Von den Einstellungen in der Datenbank habe ich keine Ahnung.

Wie bekomme ich denn raus wo die Zeichen, die ja noch richtig in der DBZelle stehen verädert werden?

Gruss Mike

X
1.177 Beiträge seit 2006
vor 13 Jahren

huhu,

Wie bekomme ich denn raus wo die Zeichen, die ja noch richtig in der DBZelle stehen verädert werden?

Die Daten in der "DBZelle" werden nur im Managementstudio richtig angezeigt. Geändert werden sie nirgends, nur die Anzeige ist falsch.

Überprüf bitte, ob die Daten vom Webservice richtig kommen (z.B. per Fiddler) und der Client das ruiniert oder ob am Webservice eine Änderung vorgenommen werden muss.

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

3.511 Beiträge seit 2005
vor 13 Jahren

Wie bekomme ich denn raus wo die Zeichen, die ja noch richtig in der DBZelle stehen verädert werden?

Hat doch Xynratron bereits geschrieben. Die Daten gehen höchstwahrscheinlich auf dem Weg Service -> Client kaputt und nicht DB -> Service. So wie du es beschrieben hast, liegt doch ein Service dazwischen, oder?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

Nein es liegt kein Service dazwischen da ich versuche den Service zum Datenabfragen der Datenbank zu erstellen. Also ich versuche diesen Service zu implementieren.

S
18 Beiträge seit 2010
vor 13 Jahren

Bitte poste doch mal folgende Daten:

Serverversion
Clientversion auf der Service-Maschine
Sortierungs-Einstellung der Datenbank und der betreffenden Spalte
den Connection-String (Passwort bitte nicht...)

Danke!

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

also ich habe mal im Microsoft SqlServermanager mit der rechten MT auf den Server geklickt und dann auf Eigenschaften. Im sich öffnenten Fenster steht dann:

Produkt: Microsoft SQL Server
BS: Microsoft Windows NT
Plattform: NT
Version:9.00....
Sprache:Deutsch
Serversortierung: Latin1_General_CI-AS

Was ist denn mit Clientversion auf der Service-Maschine gemeint?

Den Connectionstring erstelle ich mit der FKT:


 private string GetConnectionString()
    {
        string ret = String.Empty;

        ret += "server=" + ConfigurationManager.AppSettings.Get("Data_Source") + ";";
        ret += "database=" + ConfigurationManager.AppSettings.Get("database") + ";";
        ret += "User Id=" + ConfigurationManager.AppSettings.Get("UserID") + ";";
        ret += "Password=" + ConfigurationManager.AppSettings.Get("Password") + ";";

       
        return ret;

    }

wobei Data_Source, database nur einfache namen sind.

Gruss Mike

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

Ich habe eben auf

http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-connecting-connection-string.html

gelesen das man im ConnectionString das encoding mit angeben muss wenn man utf8 haben möchte. nur funktioniert dies nicht bei mir....

wenn ich meine Methode


  private string GetConnectionString()
    {
      
        string ret = String.Empty;

        ret += "server=" + ConfigurationManager.AppSettings.Get("Data_Source") + ";";
        ret += "database=" + ConfigurationManager.AppSettings.Get("database") + ";";
     
        ret += "User Id=" + ConfigurationManager.AppSettings.Get("UserID") + ";";
        ret += "Password=" + ConfigurationManager.AppSettings.Get("Password") + ";";

        //ret += "CharSet=UTF8;";
        ret += "Charset = latin1;";
        
       

        return ret;

    }

um ret += "Charset = latin1;"; oder ret += "CharSet=UTF8;"; erweitere bekomme ich immer eine Exception mit der Fehlermeldung

Schl?sselwort wird nicht unterst?tzt: 'charset'

wie soll man dann das encoding mit angeben?

Gruss Mike

T
156 Beiträge seit 2010
vor 13 Jahren

Naja, das gilt halt, wie man schon am Namen der Seite sieht, für MySql.
Aber Du hast Doch MSSql, oder. Und da wird das Ganze nicht klappen.

Also wenn Du Die Datenbank nicht irgendwie umstellen kannst, dann bleibt Dir wohl beim Abfragen der Daten eine manuelle Konvertiertung nach UTF-8


str = Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(str));

und vor eventuellem speichern wieder zurück.
LG, Marko

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

ja war eine MySql sache habe ich nicht gesehen sorry,

nur weis ich nicht wie ich die Antwort der Anfrage konvertieren kann?

Wie am Anfang geschrieben lese ich ja den Stassennamen wie folgt aus:




result.Name = reader["street"].ToString();


In Name steht dann schon ein falscher Wert "?" für die Umlaute

Gruss Mike

T
156 Beiträge seit 2010
vor 13 Jahren

Na so?


result.Name = Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(reader["street"].ToString()));

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

Also ich muss alles zuruecknehmen!!!

Der Fehler liegt woanders!!!!

wenn ich mir per SoapUI ansehe, welche Daten mein WebService sendet,
ist alles richtig. Die Umlaute wie zum Beipsiel äüöß werden richtig übertragen.

nun gilt es diese richtig per PHP anzuzeigen.

Für Eure Hilfe noch mals vielen Dank!!!

Gruss Mike

3.511 Beiträge seit 2005
vor 13 Jahren

So viel zum Thema

So wie du es beschrieben hast, liegt doch ein Service dazwischen, oder?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

M
mikefried Themenstarter:in
198 Beiträge seit 2010
vor 13 Jahren

also das Dingens soll so sein!

Ich habe eine datenbank auf einem Server. Diese hat alle Adressdaten der Kunden.
Nun soll ich einen Webservice schreiben der diese Daten erstmal anzeigen kann.

Also kann man dann eine HTML Seite per PHP erstellen, die die Daten von Herrn X anzeigt. Also greift php auf den Service zu.Dieser ist in C# geschrieben.

Gruss Mike

X
1.177 Beiträge seit 2006
vor 13 Jahren

hi Mike,

naja, wenigstens reagierst du Fix auf Fragen und Antworten. Andere schaffen nichtmal das. Aber leider bist Du wiedermal ein etwas schlechtes Beispiel. Ich persönlich schimpfe meine (IT-)Lehrlinge immer kräftig, wenn sie mit einer Frage/Problem kommen, ohne beschreiben zu können, was sie eigentlich dazu bewegt hat, zu mir zu kommen.

Für die Zukunft, guck Dir bitte immer genau an, in welcher Umgebung "Der Fehler" auftritt. Dann findet man deutlich schneller Hilfe - sei es nun im Forum oder nur "per Google" - immer Hilfe. Und, je besser ein eigenes Wissen um die Materie ist, desto besser findest du auch die Ansatzpunkte.

HappyCoding

Xynratron

PS: und benutze doch Doppelpunkte statt Ausrufezeichen.

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.