IDataReader/SqlDataReader - Integer unabhängig von der "Breite" lesen



  • Wie kann man mit einem IDataReader , bzw. in meinem Fall spezieller einem SqlDataReader , 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 auf SMALLINT downgradet. Oder von INT zu BIGINT 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 per switch (value.GetType().Blubb) entscheiden welche GetIntXx 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 ein short oder sbyte 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 nach int zu casten. Geht nämlich nicht:

    http://ideone.com/y6h2UL

    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 oder int oder long 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ärt 👍 Er 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.


Anmelden zum Antworten