Jag har en tabell i min databas för att lagra egenskaper med name och value. I min databas är value av typen ntext eftersom jag kommer behöva spara ned allt ifrån en siffra till en hel mängd html från en wysiwyg. Hur ska jag göra i min kod för att få rätt typ på värdet när det hämtas ut från min tabell?
Idag hämtar jag ut värdet såhär:
public object this[string propertyName] {
get {
if (Property.ContainsKey(propertyName))
return Property[propertyName].Value;
return null;
}
}
Någonstans måste du ha lagrat vilken datatyp det är.
public object this[string propertyName] {
get {
if (Property.ContainsKey(propertyName))
{
switch (Property[propertyName].PropertyType
{
case PropertyType.Int:
return (int)Property[propertyName].Value;
case PropertyType.String:
return (string)Property[propertyName].Value;
default:
return Property[propertyName].Value;
}
}
return null;
}
}
Jo den modellen har jag testat men jag får problem med att typa om Property[propertyName].Value till int. Value är ju alltid string eftersom det kommer från fältet ntext i databasen. Jag får helt enkelt "Cannot unbox 'Property[propertyName].Value' as a 'int'"
Jaha, det var en sträng (du sa ju faktiskt det)...
case PropertyType.Int:
return int.Parse(Property[propertyName].Value);
Ja asså, i min Property class så ser det ut såhär:
public object Value {
get { return _value; }
set { _value = value: }
}
och Value får jag serverat med Wilson ORM och det är av typen ntext i databasen. Value är väl dock alltid String eftersom det är ntext i databasen så int.Parse(Property[propertyName].Value) fungerar ju inte heller men jag skulle säkert kunna köra ToString() eller något innan men jag tycker hela den metoden känns klumpig och tycker att det borde finnas något smidigt sätt i .net 2 som gör sånna här saker möjligt. Boxing tar ju även mycket resurser.
Value är väl dock alltid String eftersom det är ntext i databasen så int.Parse(Property[propertyName].Value) fungerar ju inte heller men jag skulle säkert kunna köra ToString()
Givetviss är den alltid en string eftersom du har den som ett nText fält i databasen, det emisson menar är att du måste ha en kolumn till, där du spara ner vilken type objektet är. Så i den kolumnen står det t.ex: Int, Float, String, Double osv osv.. Och så får du läsa upp den kolumnen samtidigt som du läser upp din nText.
mage skrev:
eller något innan men jag tycker hela den metoden känns klumpig och tycker att det borde finnas något smidigt sätt i .net 2 som gör sånna här saker möjligt. Boxing tar ju även mycket resurser.
Ja det är en klumpig metod, men det är en klumpig lösning som du gör också. En av databasdesigners grundregler är att ett fält i databasen skall innehålla så lite information som möjligt och vara så specifik som möjligt. Och i ditt fall så trycker du ner vad som helst i ditt fält och förväntar dig att allt skall komma ut perfekt på andra sidan.
Jag skulle vilja säga att din ide om att man skall kunna lagra allt från ett tal till stora HTML block i samma fält i databasen är en extremt korkad ide, och bryter mot det mesta som gäller databasdesign, nu kanske du måste göra så för att det skall fungera för dig, men jag har svårt att tro det, det måste finnas bättre lösningar på vad du vill.
Hur bra .NET 2.0 nu än må vara så blir det aldrig bättre än de lösnignar som man försöker implementera. Om du spara ner allt som en sträng i database även om det är ett tal, hur vill du då att .NET skall kunna se skillnad på om du skrev in 2 eller "2". Det kan den omöjligt göra eftersom det endast står 2 i din databas.
Japp boxing tar onödiga resurser, men i ditt fall så är du så illa tvungen till det.
Ja det är en klumpig metod, men det är en klumpig lösning som du gör också. En av databasdesigners grundregler är att ett fält i databasen skall innehålla så lite information som möjligt och vara så specifik som möjligt. Och i ditt fall så trycker du ner vad som helst i ditt fält och förväntar dig att allt skall komma ut perfekt på andra sidan.
Jag förväntar mig inte att allt ska trolla sig till rätta än jag undrar om det finns en bra metod att göra det på men nu har du väldigt tydligt framfört hur korkat det är. Jag får helt enkelt har fler fält i min tabell och göra skillnad på värdetyper när jag skriver till databasen för att sedan får rätt typ när jag läser upp det.
Jag får helt enkelt har fler fält i min tabell och göra skillnad på värdetyper när jag skriver till databasen för att sedan får rätt typ när jag läser upp det.
Ja, precis så bör du göra.
278 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9