Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


hantera null värde

Postades av 2004-06-12 16:12:20 - Anders Bengtsson, i forum c# (c-sharp), Tråden har 22 Kommentarer och lästs av 930 personer

Hur ska jag hantera null värde på bästa sätt

jag har det så här och det kan vara så att antingen bookID eller movieID = null.
jag ska sen skicka in dessa i en metod och om de är null så ska jag skicka in null i den
Just nu så kraschar den för att bookid är null.

Hur ska jag skriva?

<code>
while(MyReader.Read())
{
ID = Convert.ToInt32(MyReader["ID"]);

BookID = Convert.ToInt32(MyReader["BookID "]);
MovieID= Convert.ToInt32(MyReader["MovieID"]);

}
MyReader.Close();
</code>


Svara

Sv: hantera null värde

Postades av 2004-06-12 16:51:00 - Johan Normén

Problemet är att en Int inte kan vara en null. Vad du får göra är att kolla om dess data är null och då sätta en default -1 eller annars dess värde.


int BookID = -1;
if(MyReader["BookID"] != null)
BookID = Int32.Parse(MyReader["BookID"].....
else

för att underlätta det hade jag byggt en egen IntUtil klass eller nått. Eller en Nullable klass med en metod IsNull...

public class Nullable()
{
public static bool IsNull(object value)
{
return(value == null);

}
}


if(!Nullable.IsNull(MyReader["BookID"])
BookID = Int32.Parse(MyReader["BookID"].....

Mvh Johan


Svara

Sv: hantera null värde

Postades av 2004-06-14 13:22:57 - Patrik Löwendahl

Fast <b>Convert.ToInt32</b> har inbyggd nullhanterare?!

Från reflector:

public static int ToInt32(object value)
{
   if (value != null)
  {
     return ((IConvertible) value).ToInt32(null);
 
    }
    return 0;
}


Det måste vara så att den inte löser <b>DbNull</b> eller?


Svara

Sv: hantera null värde

Postades av 2004-06-14 14:28:37 - Johan Normén

Vad man då kan göra är att bygga in konrtoll för DBNull oxå i en egen Class...

Typ:

public class Nullable()
{
public static bool IsNull(object value)
{
return(value == null || value == DBNull);
}
}

Eller om man bygger sig en egen liten convert metod där man tar med DBNull i kontrollen.

Mvh Johan


Svara

Sv: hantera null värde

Postades av 2004-06-15 17:23:37 - Mikael Petersson

Jag tror det är DBNull som måste hanteras som någon påpekade. Du kan göra så här men det rekomenderas att du även gör något åt vad som händer när det är null. Sätt dem till -1 eller liknande.

while(MyReader.Read())
{
ID = Convert.ToInt32(MyReader["ID"]);

if (MyReader["BookID"] != DBNull.Value)
BookID = Convert.ToInt32(MyReader["BookID "]);
if (MyReader["MovieID"] != DBNull.Value)
MovieID= Convert.ToInt32(MyReader["MovieID"]);

}
MyReader.Close();


Svara

Sv: hantera null värde

Postades av 2004-06-15 18:21:10 - Patrik Löwendahl

Eller om man skall ta till sig Johan Normens senaste krönika ;) :

while(MyReader.Read()) 
{ 
  ID = GetInt32(MyReader["ID"]); 
  BookID = GetInt32(MyReader["BookID "]); 
  MovieID= GetInt32(MyReader["MovieID"]); 
} 
MyReader.Close();

public int GetInt32(object obj)
{
  if  ( obj != null && obj != DBNull.Value )
  {
    return Convert.ToInt32(obj); // Convert if not null
   }
  else
  {
    return -1; // Default value
  }
}


Svara

Sv: hantera null värde

Postades av 2004-06-16 12:46:06 - Walle Hallman

Hejsan..

Man kan baka in det i en egen reader om man vill också, så att man får

public int GetInt32(int i)
		{
			if(_dataReader.IsDBNull(i))
				return Default_Int32;  // -1
			else
				return _dataReader.GetInt32(i);
		}


Eller eftersom det gäller en referens till ett annat objekt så skulle man kunna skapa en keyklass som har ett defaultvärde som är nullobjekt av keyklassen ungefär som johan beskriver med nullobjekt, http://www.refactoring.com/catalog/introduceNullObject.html



Svara

Sv: hantera null värde

Postades av 2004-06-16 13:14:36 - Johan Normén

Jag skrev lite om Nullobject i min blog för er som är intresserade:
http://www.nsquared2.net/johan/viewpost.aspx?PostID=4
Kom gärna med synpunkter.

Men det är nog riktigt lämpligt i ett såndat case som frågan gäller.

Att kapsla in readenr och göra den global är nog ingen bra idé. Spårbarheten minskar då. Sedan kan du få roliga fel i fall du kör close på readern för att du 'kanske' inte vet hur metoden ser ut. Det låter som caset inte är unikt för just den kontroll han skall göra, så jag hade lagt min egna convert i en egen klass
för att sedan kunna återanvända den på flera ställen.

Se min krönika:
http://www.pellesoft.se/documents/pageblank.aspx?id=12006
Kom även där med synpunkter, frågor eller idéer och tankar.

Mvh Johan


Svara

Sv: hantera null värde

Postades av 2004-06-16 13:23:18 - Walle Hallman

Hej

Kan du utveckla lite vad du menar med:
"Att kapsla in readenr och göra den global är nog ingen bra idé. Spårbarheten minskar då. Sedan kan du få roliga fel i fall du kör close på readern för att du 'kanske' inte vet hur metoden ser ut."

Är inte riktigt med på vad du menar.


Svara

Sv: hantera null värde

Postades av 2004-06-16 13:46:46 - Johan Normén

ok.
Vad jag menar är detta:
public int GetInt32(int i)

{...}
{
if(_dataReader.IsDBNull(i))
return Default_Int32; // -1
else
return _dataReader.GetInt32(i);
}

du har här din reader i metoden GetInt32.
Tänk dig detta senarie.

SqlDataReader this_dataReader = command.ExecuteReader......;
int value = GetInt32(3);
int value2 = GetInt32(4);
this_dataReader.Close();

kod....

int value 3 = GetInt32(6); <--- Exception... Din reader är stängd.
Säg att du inte ser implementationen i denna metod, då har du ingen aning om att den ens använder en reader.

Plus en massa andra faktorer som skulle bli en uppsats om jag berättade varför jag inte tycker du skall göra på det sättet. Men här har du en liten hint...

mvh Johan



Svara

Sv: hantera null värde

Postades av 2004-06-16 14:12:26 - Walle Hallman

Ahh ok..

Sorry, slarvigt av mig innan.. det jag menade var att du implementerar Idatareader i din egna datareader så att det blir

IDataReader reader = new NullSafeReader(command.ExecuteReader());
int value = reader.GetInt32(1);




Svara

Sv: hantera null värde

Postades av 2004-06-17 08:34:37 - Per Malmén

För att hantera null-värde på bästa sätt bör du helt enkelt designa ditt databas-schema så att nullvärden inte behövs.


Svara

Sv: hantera null värde

Postades av 2004-06-17 09:43:53 - Johan Normén


"För att hantera null-värde på bästa sätt bör du helt enkelt designa ditt databas-schema så att nullvärden inte behövs."

Det där är en designfråga. Låt säga att du har int i dbn som du inte vill a defaultvärden på för att du vill hantera dess null som olika default värden i din applikation. Säg att du skulle sätta 0 som default, detta är ett helt vanligt kodkänt värde för antal produkter. Att sätta -1 skulle kunna betyda rest på en produkt. null skulle däremot betyda att något helt annat. Varken rest eller antal. Detta var bara ett grovt exempel vanligtvis har man ju netto, brutto antal m.m. Vad jag vill peka på är att det inte alltid går att köra med en pilicy där null aldrig får förekomma. Allt beror på systemets krav.

Mvh Johan


Svara

Sv: hantera null värde

Postades av 2004-06-17 12:25:36 - Per Malmén

"Låt säga att du har int i dbn som du inte vill a defaultvärden på för att du vill hantera dess null som olika default värden i din applikation"

Varför designa sina tabeller på ett sånt sätt att man måste ha default värden som ex betyder rest på en produkt? Då anser jag att designen är felaktig. Då borde man ha en tabell över produkter och en annan med antal på olika produkter som refererar till produkttabellen.

EDIT: Sen är det naturligtvis en anna sak om man inte själv har designat DBn...


Svara

Sv: hantera null värde

Postades av 2004-06-17 15:27:32 - Johan Normén

"Detta var bara ett grovt exempel vanligtvis har man ju netto, brutto antal m.m. Vad jag vill peka på är att det inte alltid går att köra med en pilicy där null aldrig får förekomma. Allt beror på systemets krav.
"

Jag sa att det inte är vanligt ;-) Jag tog bara ett exempell ur luften för att förklara ett case. Trodde jag var tydligt med att förklara att detta exempel inte var det bästa... :-)

Och som du sa, någon kan ju ha byggt på det viset :-) Huga säger jag bara då...

Mvh Johan


Svara

Sv: hantera null värde

Postades av 2004-06-18 12:41:51 - Per Malmén

Om "någon" har designat DBn så från början är vi väl överens om att man får bita i det sura äpplet. Jag blir bara intresserad av att se ett exempel där man inte KAN klara sig utan null.


Svara

Sv: hantera null värde

Postades av 2004-06-18 16:24:48 - Göran Andersson

Det finns inget sådant exempel. Man kan alltid klara sig utan null.

Ibland blir dock designen så pass mycket enklare ifall man kan utnyttja null, att det är värt att göra det.


Svara

Sv: hantera null värde

Postades av 2004-06-18 16:46:01 - Johan Normén

Hej,

Ja du... Av samma anledning att data i en Dictionary kan vara null kan det ju vara det i en databas oxå.
Jag kan inte direkt komma på ett användarfall nu. Men det finns fall då man inte vill ha något värde då det genererar olika betydelser för applikationerna. Jag själv kör inte med null i de saker jag gjort hittils. Men jag vet fall där jag diskuterat detta med andra. Då de varken kunde ha emtpy string eller siffra.
Kommer dock inte ihåg vilket case det var... :-( så jag kan inte dra upp ett exempel där.

Skall se om detta kan hålla..

Tänk dig att du har en skala -250 000 - 250 000 alla siffror är godtagbara. Nu vill du hitta poster där
siffran inte satts för att en viss beräkning inte hunnit genomföras på x antal inlagda uppdrag. Där siffran 0 oxå är beivs på registering. Då vill man ju leta på dess null. Att ex sätta allt till 0 och skapa en flagga som betyder beräknad är ju förvisso oxå en lösning. Frågan är om flagga är aktuellt i ett kritiskt system där det skall genomföras över flera 100 000 beräkningar i secunden?

Bara tänker runt lite nu... Min filosofi i denna värld är att ALDRIG säga att inget är möjligt eller inte kommer att behöva nyttjas. Det anser jag vara en dåligutvecklare.

Mvh Johan


Svara

Sv: hantera null värde

Postades av 2004-06-18 17:06:11 - Jan Bulér

varför inte använda Try...Catch


try
{
BookID = Convert.ToInt32(MyReader["BookID "]);
}
catch
{
//BookID = Default value;
}


Svara

Sv: hantera null värde

Postades av 2004-06-18 18:16:38 - Walle Hallman

"För att hantera null-värde på bästa sätt bör du helt enkelt designa ditt databas-schema så att nullvärden inte behövs."

Detta tycker jag känns mycket konstigt. Null finns och varför inte använda det? Säg att man lägger in en händelse, och att man sedan skall ange när denna händelse har inträffat. Men när man lägger in den så vet inte när den kommer att ske, minst ett fält kommer att bli null.

Visst man kan arbeta sig runt så att man inte behöver använda null, men varför? null anger att det inte finns något inmatat i det fältet och att det är okej.


Svara

Sv: hantera null värde

Postades av 2004-06-18 18:30:21 - Johan Normén

Det är inte farligt att använda null. Det hela handlar bara om hur man som designer vill nyttja sin data.
Allt är politik och dialekter. Gör som du tycker är bäst.

Mvh Johan


Svara

Sv: hantera null värde

Postades av 2004-06-18 19:26:01 - Fredrik Normén

Jag vill bara flika in hör lite (Intresant diskution).

Ett exempel där NULL i databas är användbart är då ett värde inte är fastställt. Tex om en varchar är NULL eller Int så har den kolumen inget värde. Men om en varchar sätts till "" (tom sträng) och int till 0 så har den ett värde. Det finns situationer där man vill kunna få reda på om ett fält har ett värde eller inte, tex om Int är 0 så har den ett värde. I C# 2.0 kommer Nullable<T> att finnas för att kunna få value types att kunna vara null bara. Idag är en Int alltid ett värde, du kan inte se om du har icke tilldelat ett värde (Jo om du bestämmer dig för ett värde som ska motsvara ett NULL värde, tex 0 eller -1).

Vet inte om ni blev så mkt kolkare på detta eller om ni förstår vad jag syftar på. Men jag hoppas det ;)

/Fredrik Normén NSQUARED2
http://normen.mine.nu/myblog


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 159
27 952
271 704
1 097
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies