C# switch Problem
-
Hallo Zusammen,
habe beim Zugriff auf eine Firebird Datenbank folgendes Problem:
Bei dem Befehl:
switch (reader1[spaltenzaehlerA].GetType)
kommt folgende Fehlermeldung:
Ein Switch-Ausdruck oder eine Case-Bezeichnung muss vom Typ "bool", "char", "string", "integral", "enum" sein, oder es muss sich um einen entsprechenden Typ handeln, der NULL-Werte zulässig.
Könnte mir bitte jemand helfen und mir sagen, was ich tun muss, damit der Switch Befehl funktioniert?
Vielen Dank
Viele Grüße
Michael
-
Du musst als Ausdruck dem Switch einen Wert vom Typ "bool", "char", "string", "integral" oder "enum" übergeben.
Vielleicht solltest du uns mitteilen, was du erreichen möchtest, dann könnten wir dir womöglich besser behilflich sein.
Grüssli
-
Du verstehst aber schon den Unterschied von:
GetType
und
GetType()
-
Hallo,
danke für Eure Antworten.
Die Funktion GetType benötige ich, damit ich die Information des Spalten Typs erhalte. Also z. B. ob es sich um einen Integer, String,... handelt.
Durch den Reader1 frage ich in einer Firebird Datenbank die benötigten Werte ab.
Im Visual Basic 2010 habe ich es probiert und es funktioniert einwandfrei.Jedoch hier im C# kommt diese Fehlermeldung, die ich nicht korrigieren kann bzw. weis wie ich sie korrigieren soll.
Deshalb meine Frage ob mir jemand hier helfen kann diesen Fehler zu beheben und die von mir benötigten Informationen abzufragen.
Wäre toll, wenn mir jemand erklären könnte, wie ich diesen Fehler beseitige.
Nochmals vielen Dank
Gruß
Michael
-
Switch ist in C# deutlich restriktiver als in Visual Basic, da man nur Typen verwenden kann, wo ein Switch wirklich optimieren kann. In Visual Basic ist dein Switch grundsätzlich nur eine schönere If-ElseIf-Kette. In C# müsstest du sowas daher ebenfalls mit If-ElseIf umsetzen:
var type = reader1[spaltenzaehlerA].GetType(); if(type == typeof(string)) { // ... } else if(type == typeof(int)) { // ... } // ... etc.
Das wird aber meistens nicht als schönes Design angesehen. Wieso brauchst du diese ganzen Abfragen? Was willst du schlussendlich erreichen?
Grüssli
-
Hallo Dravere,
vielen Dank für Deine Antwort.
Also mein Ziel ist es mit dieser in C# = switch, in VB = select case
den SpaltenTyp zu ermitteln, siehe VB - Code Beispiel:Case "System.DBNull" schreibzeile &= "0" Case "System.DateTime" schreibzeile &= Format(reader1(spaltenzaehlerA), "ddMMyyyy").ToString
Nachdem ich nun weis, welcher Typ (String, Datum,...) dahinter steckt,
kann ich die Export-Datei erstellen, da ich das Ausgabeformat anpassen muss (siehe hierzu das Code-Beispiel aus VB).Vielleicht, da ich auf C# umsteigen möchte, kannst du mir da ja noch ein paar Tipps geben.
Könntest Du mir bitte zeigen wie o.g. VB Code in C# am besten umgesetzt wird?
Ja, ich weis es gibt Converter, aber den traue ich nicht so.Nochmals vielen Dank.
Viele Grüße
Michael
-
Also erstmal muß das GetType() heissen, nicht GetType. Das eine ist ein Methodenaufruf, das andere nicht.
Aber, das wird dann immer noch nicht mit switch funktionieren, also bietet sich an:
switch (reader1[spaltenzaehlerA].GetType().Name)
{
}Da der name eines Typs ja auch eindeutig ist.
Andererseits kannst Du ja auch einfach die reader-Methode GetDataTypeName() verwenden der einen String zurückliefert, also
switch(reader1.GetDataTypeName(spaltenzaehlerA))
{
}
-
switch (reader1[spaltenzaehlerA].GetType().ToString())
müsste auch funktionieren. Damit bekommst du einen string zurück.
-
Stellt sich dennoch die Frage: Wozu?
Teile uns nicht mit wie du es erreichen willst, sondern was du erreichen willst (was ist die Aufgabenstellung, bei der du glaubst, Diese nur so gelöst zu bekommen).
Vielleicht gibt es dann eine ganz andere Empfehlung jenseits von if/switch...