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
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!
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
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.
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
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.
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)
Nein es liegt kein Service dazwischen da ich versuche den Service zum Datenabfragen der Datenbank zu erstellen. Also ich versuche diesen Service zu implementieren.
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!
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
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
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
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
Na so?
result.Name = Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(reader["street"].ToString()));
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
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)
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
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.