OleDbType til managed-typer

by Jesper maj 13, 2009 11:40

En gang imellem bruger jeg oceaner af tid, på at lede i .NET frameworkets dokumentation, og på at snuse i Reflector for at finde en klasse, eller en metode, så jeg er fri for at skriveen selv. Jeg har bare på fornemmelsen, at den findes!

Sådan har jeg ledt efter en metode, der kan konverterer tallet fra skemakolonnen: “DATA_TYPE” (OleDbConnection.GetSchema()), til en almindelig .NET-type. Det er bare ikke lykkedes, så nu har jeg skrevet en selv:

public static Type GetNativeType(int oleDbType)
{
    var type = (OleDbType)oleDbType;
    switch (type)
    {
        case OleDbType.LongVarBinary:
        case OleDbType.LongVarChar:
        case OleDbType.BSTR:
        case OleDbType.DBTime:
        case OleDbType.VarWChar:
        case OleDbType.WChar:
        case OleDbType.LongVarWChar:
        case OleDbType.VarChar:
            return typeof(string);

        case OleDbType.DBDate:
        case OleDbType.DBTimeStamp:
        case OleDbType.Date:
            return typeof(DateTime);

        case OleDbType.Decimal:
        case OleDbType.Currency:
            return typeof(decimal);

        case OleDbType.Double:
            return typeof(double);

        case OleDbType.UnsignedSmallInt:
        case OleDbType.Integer:
        case OleDbType.SmallInt:
            return typeof(Int16);

        case OleDbType.UnsignedInt:
        case OleDbType.Error:
            return typeof(Int32);

        case OleDbType.BigInt:
        case OleDbType.Filetime:
        case OleDbType.UnsignedBigInt:
            return typeof(Int64);

        case OleDbType.Guid:
            return typeof(Guid);

        case OleDbType.Numeric:
        case OleDbType.VarNumeric:
            return typeof(float);

        case OleDbType.Single:
            return typeof(Single);

        case OleDbType.TinyInt:
        case OleDbType.UnsignedTinyInt:
            return typeof(byte);

        case OleDbType.VarBinary:
        case OleDbType.Binary:
            return typeof(byte[]);

        case OleDbType.Boolean:
            return typeof(bool);

        case OleDbType.Char:
            return typeof(char);

        case OleDbType.Empty:
            return null;

        case OleDbType.IDispatch:
        case OleDbType.IUnknown:
        case OleDbType.Variant:
        case OleDbType.PropVariant:
        default:
            throw new NotSupportedException("Ikke understøttet type: " + type.ToString());
    }
}

Det tog ikke lang tid, sammenlignet med den tid jeg brugte med næsen i dokumentationen. Koden virker, men jeg sidder bare og er noget utilfreds, for jeg VED at der eet eller andet sted, i vores store framework, findes en klasse med en metode der gør lige netop det min metode gør. Men hvordan finder man den?

Jeg er sikker på at min publicering her, vil afstedkomme en kommentar som: “Hvorfor bruger du ikke bare: xxx.GetType()….”. Og den glæder jeg mig til at se :-)

Code on…

Tags:

Kommentarer

13-05-2009 22:26:20 #

Mark S. Rasmussen

Hvad er formålet med metoden?

Mark S. Rasmussen Denmark

14-05-2009 08:28:20 #

Jesper

@mark> returnerer en type ud fra en OleDbType enum.

Jesper Denmark

14-05-2009 11:35:57 #

Mark S. Rasmussen

Hehe, så langt havde jeg selv gættet Smile

Jeg tænker mere, hvad skal du bruge det til? Hvad er brugsscenariet der gjorde at du udviklede metoden?

Mark S. Rasmussen Denmark

14-05-2009 14:43:46 #

Jesper

@Marc> Udvikle og udvikle... Smile
Jeg arbejder med noget undervisningsmateriale, hvor mine eksempler autogenerere et datalag ud fra et database skema. I den forbindelse er det jo smart at vide hvad DATA_TYPE = 130 betyder...

Jesper Denmark

15-05-2009 09:28:29 #

Mark S. Rasmussen

Ok. Jeg vil ikke vurdere nødvendigheden i så fald da det er svært at tale om uden at vide noget mere konkret om brugsscenariet.

Jeg vil dog foreslå at du tager en OleDbType ind som parameter i stedet for en int - det giver en væsentligt pænere kontrakt. Som det er nu kan du let komme til at sende en tilfældig int ind og derved forårsage en exception. Du caster alligevel til OleDbType inde i din funktion, så hvorfor ikke bare tage den ind direkte?

Mark S. Rasmussen Denmark

15-05-2009 09:52:51 #

Jesper

@Marc> DATA_TYPE kolonnen indeholder int, men det er nu også lidt ved siden af den pointe jeg forsøgte at komme med.
Her i min klasse skal jeg tage stilling til f.eks. at OleDbType.Error kan castes som en Int32. Det er noget jeg har analyseret mig frem til, og hvad hvis provideren kommer med nye typer - så skal jeg udvidde min klasse. Det er jo sådan noget der burde (og sikkert også gør) ligge i en framework funktion.

Jesper Denmark

15-05-2009 10:24:29 #

Mark S. Rasmussen

Mit navn er Mark - hvilket du også ramte rigtigt første gang ;)

DATA_TYPE kolonnen indeholder givetvis en int, men det er udelukkende fordi ADO ikke kan returnere andet end simple datatyper - den kan ikke automatisk caste til OleDbType.

Hvis provideren pludselig får tilføjet en ny datatype - så skal ud udvidde din funktion, ja. Men det skal du jo uanset? Du bør altid kunne caste din DATA_TYPE til en OleDbType da API'et og provideren bør følges ad versionsmæssigt. Uanset hvor, så vil din metode caste en exception hvis ikke du tager højde for den OleDbType.

Jeg tvivler på det ligger i frameworket. Hvis det gør, så vil det ligge i OleDb namespacet da det er direkte relateret hertil. Jeg har aldrig hørt om nogen bruge en funktion som denne og umiddelbart passer den heller ikke ind i BCL frameworket da den er noget specialiseret - det er et OR/Ms opgave at lave den mapping, ikke BCL.

Mark S. Rasmussen Denmark

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  september 2010  >>
mationtofr
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentComments

Comment RSS