IDataReader/SqlDataReader - Integer unabhängig von der "Breite" lesen
-
Wie kann man mit einem
IDataReader
, bzw. in meinem Fall spezieller einemSqlDataReader
, nen Integer lesen, ohne wissen zu müssen welchen Typ das Ding genau hat.Irgendwie hatte ich gehofft dass die
GetIntXx
Funktionen wenigstens selbständig verbreitern (z.B.short
->int
) wenn der Typ nicht passt. Und im Idealfall auch verschmälern, wenn der Wert dabei nicht abgeschnitten ist.Bloss ... naja, Fehlanzeige.
Ich meine, bin ich der einzige dem das BESCHEUERT vorkommt? Oder übersehe ich nur gerade eine einfache Möglichkeit das zu machen?
Begründung warum ich das bescheuert finde: es sorgt dafür dass Applikationen unnötigerweise "zerbrechen", wenn man mal den Typ einer Spalte in der DB ändert. z.B. um Platz zu sparen von
INT
aufSMALLINT
downgradet. Oder vonINT
zuBIGINT
upgradet, weil einem die Keys ausgehen.Die Änderung in der bzw. den Applikationen nachzuziehen ist in solchen Fällen extrem aufwendig, da sich die Stellen wo auf die entsprechenden Felder zugegriffen wird verdammt schlecht suchen lassen.
Klar, mit EntittyFramewörk (tm) wäre das nicht passiert. Bzw. auch passiert, nur dann wären die zu-ändernden Stellen wenige und schnell gefunden. Nur verwendet halt nicht alles das EF, und ich hab' auch nicht vor mich wegen ein paar kleinerer Tools "schnell mal" ins EF einzulesen.
Und ... dass ich mir meine eigene(n) GetIntXx Funktionen basteln kann, die dann entweder per
if
-Orgie oder perswitch (value.GetType().Blubb)
entscheiden welcheGetIntXx
Funktion aufzurufen ist... das ist mir auch klar. Ich fände es nur nen krassen Oversight falls ich das wirklich tun müsste.
-
Bist du dir sicher das wenn du den Downgrad in der Datenbank machst, dass dir da nicht auch Daten verloren gehen? Ich wuerde es sehr komisch finden wenn die Datenbank einen 4Byte Integer in einen 2Byte Smallint quetschen kann. Und selbiges hast du bei den Methoden mit den du arbeitest.
-
Ja, ich bin mir sicher.
Ich rede von Fällen wo es geht, weil der effektiv verwendete Wertebereich klein genug is.Ich meine, wo soll das Problem sein wenn ich nen
int
mit Inhalt 42 ein einshort
odersbyte
konvertieren will?
Und nein, das ist keine echte Frage. Ich hab das im SQL Server Management Studio schon oft genug gemacht, und in C# auch. Ich weiss dass es geht.
-
Mir ist keine verfügbare Funktion bekannt, welche immer das "richtige" int zurückliefert. Ich finde, MS hat es sich hier ein bisschen zu einfach gemacht, aber na ja.
Alternativ zur eigenen Funktion könntest du über GetValue die Spalte auslesen und dann einfach casten.
-
Ja wenn das ginge wäre ja alles schön.
Versuch mal nen geboxten
short
nachint
zu casten. Geht nämlich nicht:EDIT: oder gibt es dafür (unboxen eines unbekannten Integer-Typs) etwa eine fertige Hilfsfunktion? DAS ist nämlich auch so ein Punkt wo ich mir denke... HALLO??? Wieso muss ich wissen ob irgend ein geboxtes Ding ein
short
oderint
oderlong
ist? WTF?
-
Nimm Convert.ToInt32
Dann klappt das. Auch wenn es kein echter Cast mehr ist.
Wenn ihr hausintern ein WTF-Contest laufen habt, kannst du auch int.Parse(o.ToString()) machen.. muahaha
-
-
GPC schrieb:
Nimm Convert.ToInt32
Dann klappt das. Auch wenn es kein echter Cast mehr ist.
Genaugenommen doch, das ist _der_ echte cast für die Situation:
Zitat aus dem oben verlinkten Artikel:
" If you want to call the slow method that does all that goo, it’s available – you can always call Convert.ToInt32, which does all that analysis at runtime for you. We give you the choice between “fast and precise” or “slow and lax”, and the sensible default is the former. If you want the latter then call the method."
(von einem: principal developer on the C# compiler Team)
-
Ich sagte, dass es kein cast ist, weil ich damit die syntaktische Schreibweise meinte
Aber Eric Lippert hat es wieder mal sehr gut erklärtEr ist inzwischen nicht mehr bei MS btw
-
Ah, danke!
Ist zwar doof dass man über boxing/unboxing gehen muss, aber immer noch besser als es selbst zu programmieren.