webForumDet fria alternativet

undvika hårdkodning

15 svar · 874 visningar · startad av doggelito

doggelitoMedlem sedan juni 20003 076 inlägg
#1

I databasen har jag en kolumn "HostType" (nvarchar) som innehåller värdena "DATABASE" eller "XML"

Sen på aspx-sidorna kör jag ofta ex:

if(HostType == "DATABASE")
     ...

Detta är ju inge bra att ha i längden! :D
Jag skulle vilja ha så här:

if(HostType == HostTypes.Database)
     ...

Vad behöver jag göra då?
Jag kikade lite på att använda en enum men den räknar ju int-värden.
Ska jag bygga om i databasen och lagra tal-värden istället för att passa en enum? Eller finns det andra lösningar?

voigtann1Medlem sedan juni 20019 519 inlägg
#2

du kan ju skapa en klass HostTypes med en get metod som är static?

freguzMedlem sedan feb. 2005280 inlägg
#3

Det är enkelt ordnat med enum :birp

public enum HostTypes
{
    Database,
    XML
}
doggelitoMedlem sedan juni 20003 076 inlägg
#4

voigtann1 skrev:

du kan ju skapa en klass HostTypes med en get metod som är static?

Ahh, fiffigt! Tack! :bire

frequz skrev:

Det är enkelt ordnat med enum

Enums har jag inte jobbat med förrut men de verkar användarvänliga och trevliga! :) Men visst skulle väl det kräva att jag strukturerar om databasen till att lagra int istället för string?

freguzMedlem sedan feb. 2005280 inlägg
#5

doggelito skrev:

frequz skrev:

Det är enkelt ordnat med enum

Enums har jag inte jobbat med förrut men de verkar användarvänliga och trevliga! :) Men visst skulle väl det kräva att jag strukturerar om databasen till att lagra int istället för string?

Nja, int är det bästa men om det förstör db upplägget i övrigt kan du bara lägra siffrorna i nvarchar fältet bara som det är nu o casta i jämförelsen...och lägga in ett värde per HostType i enuym oxå... blir inte lika rent längre, så då kanske poängen går förlorad...


if(Convert.ToInt32(HostType) == (int)HostTypes.Database)
     ...

public enum HostTypes
{
    Database = 1,
    XML = 2
}
doggelitoMedlem sedan juni 20003 076 inlägg
#6

Mm, precis som du skriver så känns det som om poängen går förlorad då.
Men det är bra att veta tills nästa gång (eller om jag väljer att strukturera om redan nu)!
Dock vet jag inte om jag riktigt gillar idén med att lagra sånna här typer av värden som int i databasen. Det blir hopplöst då att gå in i databasen och titta i tabellerna, man kan inte tyda nånting, bara en massa siffror som inte säger nånting!

freguzMedlem sedan feb. 2005280 inlägg
#7

hmm tänker bara lite högt nu.. borde man inte kunna serialisera ner en enum o spara i ett fält i db och sen återskapa den igen...?

NickemannenMedlem sedan aug. 20003 575 inlägg
#8

doggelito skrev:

Mm, precis som du skriver så känns det som om poängen går förlorad då.
Men det är bra att veta tills nästa gång (eller om jag väljer att strukturera om redan nu)!
Dock vet jag inte om jag riktigt gillar idén med att lagra sånna här typer av värden som int i databasen. Det blir hopplöst då att gå in i databasen och titta i tabellerna, man kan inte tyda nånting, bara en massa siffror som inte säger nånting!

Databasen används väl egentligen inte som någon slags presentation?
Jag tycker du skall köra på integers i databasen.

erkaMedlem sedan dec. 19996 522 inlägg
#9

Lyssna på Nickemannen :)

doggelitoMedlem sedan juni 20003 076 inlägg
#10

Nickemannen skrev:

Databasen används väl egentligen inte som någon slags presentation?

Kloka ord! :D
Det är just under utvecklingen som jag vill kunna se vad som hänt i databasen, inte när siten rullat i månader/år. Men det kanske man kan vänja sig ifrån! :)

spangoMedlem sedan juni 20008 205 inlägg
#11

freguz skrev:

hmm tänker bara lite högt nu.. borde man inte kunna serialisera ner en enum o spara i ett fält i db och sen återskapa den igen...?

Ja, det finns en behändig parsemetod i Enum-klassen...

public enum Stuff { Foo, Bar, Baz; }
...
Stuff thing = Stuff.Foo;
string str = thing.ToString();
Stuff sameThing = [URL=http://msdn2.microsoft.com/en-us/library/system.enum.parse.aspx]Enum.Parse[/URL](typeof(Stuff), str);
// sameThing == thing == Stuff.Foo
Stuff bar = Enum.Parse(typeof(Stuff), "BAR", true);
// bar == Stuff.Bar
doggelitoMedlem sedan juni 20003 076 inlägg
#12

Nu har jag stuvat om i databasen och lagrar integers istället! :)
Men det blev ändå inte som jag tänkt mig! :q
Kör denna enum nu:

public enum HostTypes
{
    DataBase = 1,
    Xml
}

Men då säger den rackarns debuggern att:
Cannot implicitly convert type 'HostTypes' to 'int'.
Måste jag typomvandla min hosttype varje gång jag använder den så att det blir:

if(HostType == (int)HostTypes.DataBase)
     ...

Eller?
Det är ju bara snäppet bättre än vad jag hade från början! :(

Eller har jag missat nått?

spangoMedlem sedan juni 20008 205 inlägg
#13

Smartare är väl att typomvandla en gång för alla, och då en int till enumtypen, istället för tvärtom:

HostTypes ht = (HostTypes)LäsIntVärdeFrånDatabasen();
if (ht == HostTypes.DataBase) ...
GladhMedlem sedan maj 20012 812 inlägg
#14

Jag lägger min näsa iblöt lite..

Det spelar ingen som helst roll rent kodmässigt om du använder dig av int eller strängar i databasen. Man kan enkelt få tillbaka sin enum utifrån en sträng med hjälp av Enum.Parse() metoden.

Helt klart är att databasen oftas inte är ett presentationslager utan endast datakälla och den bör optimeras utifrån det. Det finns dock tillfällen då man väljer att bortse från normaliseringsgraden (som är basen för alla databaser) för att öka prestandan i frågorna mot databasen. Det finns tillfällen när man dubbellagrar information för att öka prestandan i frågorn mot databasen, och det finns tillfällen då man väljer att skriva ut saker i klarttext istället för siffor i databasen av den enkla anledningen att man ofta läser datan från databasen. Ett typ exempel på det är en loggningsdatabas, här sparas alla loggningsinformation ner, och här skulle jag aldrig spara ner värden som integer om det komm från en enum i koden. Säg att du har en enum som heter Environment, denna kan innehålla typ: Development, Test, Production, eller 1,2,3 när man läser i databasen är det mycket trevligare att det står i klarttext vilken miljö man körde mot än en siffra. Men återigen det är om du har ett stor behov av att läsa tabellerna i databasen, har du inte det, så finns det ingen som helst anledning att spara ner det som text och ta extra uttrymme och prestanda i anspråk.

Du behöver inte sätta några siffor på din enumvärden, de börjar automatiskt räknas på 1 och sedan räknas upp för varje val, det är dock rätt bra att göra det, så kanske du tänker dig för innan du stoppar in ett nytt värde emellan de två du har, och värdet 2 i databasen får en helt ny innebörd.

- M

cokMedlem sedan dec. 2005664 inlägg
#15

Gladh skrev:

Du behöver inte sätta några siffor på din enumvärden, de börjar automatiskt räknas på 1 och sedan räknas upp för varje val, det är dock rätt bra att göra det, så kanske du tänker dig för innan du stoppar in ett nytt värde emellan de två du har, och värdet 2 i databasen får en helt ny innebörd.

- M

Nja, de börjar på noll som default

doggelitoMedlem sedan juni 20003 076 inlägg
#16

spango skrev:

Smartare är väl att typomvandla en gång för alla, och då en int till enumtypen, istället för tvärtom:

Naturligtvis, smart! Tack! :bire

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)