[ASP.NET (vb)] Waarde uit db in var zetten geeft Null fout

Pagina: 1
Acties:

  • SilenceTi
  • Registratie: Maart 2002
  • Niet online
Ik probeer een waarde uit een database in een variable te stoppen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%

    dim voornaam as string 
    dim achternaam as string

    Dim dbRead as OleDbDataReader
    Dim sConnectionString As String
    Dim PathInfo as string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\web\dotnet\test.mdb"
    Dim con as OleDbConnection = new OleDbConnection(PathInfo)
    Dim SQL as String = "Select * from tblNaam where id =1"
    Dim da as OleDbCommand = new OleDBCommand(SQL,Con)
    
    con.open
    
    WHILE dbRead.Read()
        voornaam = dbread("voornaam")
        achternaam = dbread("achternaam")
    End While

    %>

Voornaam: <B><%=(voornaam)%></B><BR>
Achternaam: <B><%=(achternaam)%></B>


    <%
    dbRead.close
    Con.close

%>


Wat doe ik fout? :'(

Foutmelding:
code:
1
System.NullReferenceException: Object reference not set to an instance of an object.


heb ook geprobeerd met response.write gelijk na End While te zetten maar dat werkte ook niet...

Wie kan mij helpen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Op welke regel krijg je die fout?
Heb je al eens gedebugged?

Het lijkt me dat je een of ander object niet gealloceerd hebt.
En dat zal je datareader zijn.
Je moet nog de executereader method van het SqlCommand object aanroepen vooraleer je de data kunt uitlezen.
Die method returned nl. een datareader waarmee je door je data kunt lopen.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

En in welke regel gaat het fout? Test je wel op error condities? Wat heb je al zoal geprobeerd?

Lees even P&W FAQ - De "quickstart" door, puur en alleen 'hij doettutnie' kunnen we niets mee. Die null-pointer exception betekent niets anders dan dat een van je functies NULL terug heeft gegeven die je vervolgens zonder error checking opslaat en waar je functies op aan gaat roepen. Check ook onze inhoudelijke FAQ wat dat betreft.

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Even heropend. ;)

curry684 heeft wel gelijk dat je met wat meer informatie over de brug mag komen. In P&W wordt er van jezelf ook wel wat zelfwerkzaamheid verwacht; dat is, zelf eens nagaan waar die error precies optreedt en wat de mogelijke fouten / oorzaken kunnen zijn.

P&W is geen McDonalds afhaaldienst voor code enzo.

https://fgheysels.github.io/


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Het is inderdaad handiger even te vermelden op welke regel de fout zich voordoet, maar in ieder geval:

Ik gok dat je de methode Execute.Reader in je code vergeet en dus ook de DataReader niet kan gebruiken:
ASP:
1
db.read = cmdSelect.ExecuteReader()

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


Verwijderd

dbread.item("Voornaam")
Wat jij doet is oude asp... denk ik
-> k dan niet: mea culpa, mea maxima culpa :X

[ Voor 35% gewijzigd door Verwijderd op 12-06-2003 17:09 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Verwijderd schreef op 12 June 2003 @ 16:49:
dbread.item("Voornaam")
Wat jij doet is oude asp... denk ik
Niets van.

Je moet de ExecuteReader method van de SqlCommand uitvoeren. Die returned een dataReader.

Dan kan je de data als volgt gaan uitlezen:

code:
1
2
3
4
5
SqlDataReader dr = SqlCommand1.ExecuteReader();

string s = Convert.ToString(dr["naam"]);
// er kan ook gebruik gemaakt worden van numerieke indexen (zero-based)
string s2 = Convert.ToString(dr[1]);


Bovenstaande is C# code. Ik zou even moeten uitzoeken of je in VB.NET misschien wel die Item constructie nodig hebt, maar ik vermoed van niet.

[ Voor 13% gewijzigd door whoami op 12-06-2003 16:52 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 12 juni 2003 @ 16:52:
Bovenstaande is C# code. Ik zou even moeten uitzoeken of je in VB.NET misschien wel die Item constructie nodig hebt, maar ik vermoed van niet.
* gorgi_19 bevestigt het van whoami :P

* gorgi_19 vindt trouwens een constructie, zeker bij 1 record, van

Visual Basic .NET:
1
2
3
if dbRead.Read Then
 ....
End if

Ietsie netter in dit geval.

[ Voor 33% gewijzigd door gorgi_19 op 12-06-2003 17:08 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Probeer het volgende maar eens: :)
ASP.NET:
1
2
3
4
5
6
7
8
9
10
Dim dbRead as OleDbDataReader, sbResults as new StringBuilder ()
dbRead = cmdSelect.ExecuteReader()

do while dbRead.Read ()
sbResults.Append ("<b>")
sbResults.Append (dbRead.GetString(1) )
sbResults.Append ("<br>")
sbResults.Append ("dbRead.GetString(2) )
sbResults.Append ("</b>")
loop

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Dat kan je idd ook doen, en dat zal dan nog sneller zijn ook.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
Dim dbRead as OleDbDataReader
Dim outputvalue as string = ""

Const m_sValue as string = "<b>{0}<br>{1}</b>"

dbRead = cmdSelect.ExecuteReader()

If dbRead.Read Then
    outputvalue = String.Format(m_sValue, dbRead(0),dbRead(1))
End if

* gorgi_19 is op zich ook wel fan van constanten.. :P

<font color=red>gewoon ff wat testen...</font>
<font color=blue>Testje geslaagd :P...</font>

[ Voor 53% gewijzigd door gorgi_19 op 12-06-2003 17:37 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • SilenceTi
  • Registratie: Maart 2002
  • Niet online
aah dank jullie wel, was inderdaad de executereader vergeten |:(

  • Scharnout
  • Registratie: November 2000
  • Laatst online: 19-08 17:23

Scharnout

Meuk

Gorgi, waarom gebruik jij een contante daar? Ofwel, op basis van welke kennis gebruik je dit (artikelen/benchmark/goed boek).

En iemand vertelde mij laatst dat je beter een dataset kan gebruiken ipv een datareader. Ook om alleen data te lezen.

And Bob's your uncle ...


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Een datareader is een read-only en forward only 'cursor' om door je data te lopen.
Een DataReader is sneller dan een DataSet (een DataSet gebruikt intern een reader), maar het nadeel vn een datareader is wel dat je connectie exclusief door die datareader gebruikt wordt. Zolang die datareader dus open staat, kan je die connectie niet voor iets anders gebruiken.
Het hangt een beetje van situatie tot situatie af welke je het best gebruikt.

Je gebruikt wel best geen datareader in je aspx pagina zelf, omdat je zo je presentatie onlosmakelijk koppelt met je data-access.
Je kan natuurlijk wel een DAL class maken die een ArrayList returned met data in die opgevuld werd dmv een DataReader, maar je kan evengoed een DataTable of DataSet returnen.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Scharnout schreef op 13 June 2003 @ 09:59:
Gorgi, waarom gebruik jij een contante daar? Ofwel, op basis van welke kennis gebruik je dit (artikelen/benchmark/goed boek).
Zie oa http://www.asp.net/Forums...x?tabindex=1&PostID=40733
Justin geeft hier wat achtergrondinformatie over.

Sowieso vind ik het zelf ook een stuk duidelijker werken dan om via de stringbuilder aan de gang te gaan.

[ Voor 61% gewijzigd door gorgi_19 op 13-06-2003 10:28 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Scharnout
  • Registratie: November 2000
  • Laatst online: 19-08 17:23

Scharnout

Meuk

Gorgi, je link doet het neit :)

whoami:
Dus voor een webshop is een datareader dus zowieso geen optie?

Zowieso vind ik het nog moeilijk om performance beslissingen te maken in .net Ik ben bijvoorbeeld aan het hobby-en met een soort online minesweeper/zeeslag/memory, maar dan 1 waar je met meer dan 2 personen aan kan spelen. Gewoon om de techniek allemaal een beetje te testen. En nu krijg ik wel allerlei buttons online die het "grid"maken (niet datagrid dus)waar je op kan klikken. (ik maak het "grid"aan in een class obv ingevoerde aantal of aantal spelers, bjivoorbeeld 50x50 buttons). Maar ja als straks 1000 man dat spel gaan zitten doen, heb ik een zwaar probleem want dat kan je volgens mij niet aan. (bijhouden wie wat al heeft geklikt enzo, of bijvoorbeeld meerdere spellen die lopen). Want telkens als iemand een "zet"doet dan heb je een post en gaat hij de status van die butoon updaten. Maar iemand anders kan dan niet meer die button klikken en moet dus een soort van foutmelding krijgen, want direct naar alle clients updaten lijkt me onmogelijk

Iemand daar nog links of artikelen voor? Voor performance in relatie met dit onderwerp? Of zal ik een nieuw topic openen? (misschien een beetje wazig namelijk).

And Bob's your uncle ...


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Scharnout schreef op 13 juni 2003 @ 10:25:
Gorgi, je link doet het neit :)
Nu wel.. :P
whoami:
Dus voor een webshop is een datareader dus zowieso geen optie?
Imho wel. Als je bijvoorbeeld een username wil ophalen, en je geeft een userID terug na validatie, kan je dit imho best doen mbv een datareader. Complete overzichten zou ik datasets voor gebruiken; op deze manier kan je ook nog paging en sorting toepassen.

Sowieso nog een extra tip: Kijk ook eens naar de System.Web.Caching namespace. 2e tip; kijk eens naar IBuySpy store, een voorbeeldapplicatie van Microsoft. Weliswaar hebben ze hier op een vrij brakke manier de datalayer gemaakt, maar het geeft iig wel een idee van de mogelijkheden.
Zowieso vind ik het nog moeilijk om performance beslissingen te maken in .net Ik ben bijvoorbeeld aan het hobby-en met een soort online minesweeper/zeeslag/memory, maar dan 1 waar je met meer dan 2 personen aan kan spelen. Gewoon om de techniek allemaal een beetje te testen. En nu krijg ik wel allerlei buttons online die het "grid"maken (niet datagrid dus)waar je op kan klikken. (ik maak het "grid"aan in een class obv ingevoerde aantal of aantal spelers, bjivoorbeeld 50x50 buttons). Maar ja als straks 1000 man dat spel gaan zitten doen, heb ik een zwaar probleem want dat kan je volgens mij niet aan.
(bijhouden wie wat al heeft geklikt enzo, of bijvoorbeeld meerdere spellen die lopen). Want telkens als iemand een "zet"doet dan heb je een post en gaat hij de status van die butoon updaten. Maar iemand anders kan dan niet meer die button klikken en moet dus een soort van foutmelding krijgen, want direct naar alle clients updaten lijkt me onmogelijk
Je wilt iets dus realtime doen? Lijkt me dan niet dat je met ASP.Net aan de gang moet; maar een applicatie welke contact maakt met een server. Een soort online gaming. Je bent dan ook gelijk af van het probleem van het updaten; dit is dan ook mogelijk.

In principe lijkt me ASP.Net, of welke webtaal dan ook, volstrekt ongeschikt hiervoor.

[ Voor 9% gewijzigd door gorgi_19 op 13-06-2003 10:35 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
gorgi_19 schreef op 13 June 2003 @ 10:34:
[...]

Imho wel. Als je bijvoorbeeld een username wil ophalen, en je geeft een userID terug na validatie, kan je dit imho best doen mbv een datareader. Complete overzichten zou ik datasets voor gebruiken; op deze manier kan je ook nog paging en sorting toepassen.
Een datareader kan je inderdaad nog altijd perfect gebruiken. Als je bv. een class Person hebt, die info bijhoudt over 1 person, en je wilt de data uit een DB halen, dan kan je een Reader gebruiken om die class op te vullen.
In jouw voorbeeld gorgi_19, kan je misschien beter de ExecuteScalar method gebruiken. Je krijgt nl. slechts 1 value terug die je wilt uitlezen en dan kan je dat makkelijk met die method doen.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 13 June 2003 @ 10:41:
[...]

Een datareader kan je inderdaad nog altijd perfect gebruiken. Als je bv. een class Person hebt, die info bijhoudt over 1 person, en je wilt de data uit een DB halen, dan kan je een Reader gebruiken om die class op te vullen.
In jouw voorbeeld gorgi_19, kan je misschien beter de ExecuteScalar method gebruiken. Je krijgt nl. slechts 1 value terug die je wilt uitlezen en dan kan je dat makkelijk met die method doen.
Ow ja, dat was die method waar ik gisteren pas achter kwam...
* gorgi_19 makes a mental note om hier en daar wat code aan te gaan passen....

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Scharnout
  • Registratie: November 2000
  • Laatst online: 19-08 17:23

Scharnout

Meuk

gorgi_19 schreef op 13 June 2003 @ 10:34:

Imho wel. Als je bijvoorbeeld een username wil ophalen, en je geeft een userID terug na validatie, kan je dit imho best doen mbv een datareader. Complete overzichten zou ik datasets voor gebruiken; op deze manier kan je ook nog paging en sorting toepassen.

Sowieso nog een extra tip: Kijk ook eens naar de System.Web.Caching namespace. 2e tip; kijk eens naar IBuySpy store, een voorbeeldapplicatie van Microsoft. Weliswaar hebben ze hier op een vrij brakke manier de datalayer gemaakt, maar het geeft iig wel een idee van de mogelijkheden.
Ja ik zal die IbuySpy eens gaan doorlopen nu ik wat verder ben.

Maar ik las net bij whoami dat hij de connectie exclusief gebruikt ... oh wacht .. je maakt natuurlijk bij een ander client een nieuwe connectie |:( (meer kofiie! meer koffie! :))
Je wilt iets dus realtime doen? Lijkt me dan niet dat je met ASP.Net aan de gang moet; maar een applicatie welke contact maakt met een server. Een soort online gaming. Je bent dan ook gelijk af van het probleem van het updaten; dit is dan ook mogelijk.

In principe lijkt me ASP.Net, of welke webtaal dan ook, volstrekt ongeschikt hiervoor.
Dat lijkt mij ook. Nee het moet meer zo zijn in het tempo van schaken. Dus er kan best een half uur tussen een zet zitten, maar omdat je misschien 1000 spellen tegelijk hebt lopen vraagt dat misschien best veel van de servert om telkens weer zoon grid met alle zetten er al op te bouwen

And Bob's your uncle ...


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Scharnout schreef op 13 June 2003 @ 11:06:
Dat lijkt mij ook. Nee het moet meer zo zijn in het tempo van schaken. Dus er kan best een half uur tussen een zet zitten, maar omdat je misschien 1000 spellen tegelijk hebt lopen vraagt dat misschien best veel van de servert om telkens weer zoon grid met alle zetten er al op te bouwen
* gorgi_19 denkt dat het opbouwen van zo een grid wel mee valt qua performance. Desnoods cache je het standaard grid en hou je in een arraylist bij welke slagen er zijn geweest en wat de resultaten waren.

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1