[VB.NET] DataReader => DataGrid ?

Pagina: 1
Acties:
  • 125 views sinds 30-01-2008
  • Reageer

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Ik heb een applicatie die klantgegevens uit een Exact database moet gaan halen (MS SQL).

Nu heb ik die data keurig in een DataReader, maar ik krijg het niet voor elkaar om deze weer te geven in een DataGrid.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Friend WithEvents cmdQuery As System.Data.SqlClient.SqlCommand

Me.cmdQuery = New System.Data.SqlClient.SqlCommand()
Me.cmdQuery.CommandType = CommandType.Text
Me.cmdQuery.Connection = CN
Me.cmdQuery.CommandText = "SELECT cmp_code, cmp_name, cmp_fCity, cmp_tel, cmp_fax FROM cicmpy ORDER BY cmp_name"
Dim rdrResources As System.Data.SqlClient.SqlDataReader
OpenDataBase()
rdrResources = Me.cmdQuery.ExecuteReader
DataGrid1.DataSource = rdrResources
DataGrid1.DataBind()
CloseDataBase()
Me.Activate()


Overigens staan OpenDataBase, CloseDataBase en CN in een Module.. deze werken in ieder geval naar behoren, want ik kan gewoon gegevens opvragen met bijvoorbeeld rdrResources.Item("cmp_name")

Dit stuk code valt vooral over het DataGrid1.DataBind() gedeelt, maar volgens diverse sites moet het op deze manier.. ik kom d'r niet meer uit ;(

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Waarom gebruik je een datareader en geen dataset?

Trouwens, wat is het probleem eigenlijk? Je zegt dat het niet werkt ofzo, maar gaat er dan niet?

[ Voor 51% gewijzigd door whoami op 25-02-2003 14:47 ]

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Eerlijk antwoord? Ik kreeg de dataset niet aan de gang, tenminste, niet vanuit de vb code. Ik ben er een tijdje mee bezig geweest en heb verschillende howto's gelezen, maar had het toen al voor elkaar met een datareader.. wat overigens veel makkelijker werkt.. je geeft gewoon een query op, voert em uit en net als met asp, php enzo lees je de waardes uit door de kolomnaam op te geven.

Maarja, dan loop je dus op zo'n punt vast.. ik kan niet een soort While rdrResources.Read (dus zolang er rows zijn) loop maken en daarin iedere keer nieuwe dataset rows aanmaken en de data van de reader in de dataset pompen.. tenminste, ik krijg dat niet voor elkaar

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Je moet wel goed weten wat de beperkingen van een datareader zijn: die is forward only en read only.

Een Dataset is heel wat krachtiger, en je kan de wijzigen die je in de dataset doet ook committen naar de databank. Trouwens, een DataReader gebruiken in je ASP.NET page (in je presentatie-laag dus), is niet zo goed.

Een DataSet vul je zo mbhv een DataAdapter.
zo:
code:
1
2
3
4
5
6
7
8
SqlCommand cmd = new SqlCommand();
cmd.Connection = ...
cmd.CommandText = ...

SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill (ds);

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Erm.. tis vb.net, geen asp.net... het ging alleen even om de vergelijking met asp en php. Ik zal je bovenstaande code eens ff proberen.. hoewel deze voor asp.net is, maar dat moet wel gaan werken

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Mephix schreef op 25 February 2003 @ 14:58:
Erm.. tis vb.net, geen asp.net... het ging alleen even om de vergelijking met asp en php. Ik zal je bovenstaande code eens ff proberen.. hoewel deze voor asp.net is, maar dat moet wel gaan werken


ASP.NET is een technologie om dynamische webpages te maken. De programmeertaal die je daarvoor kunt gebruiken is VB.NET of C#. (Mijn code voorbeeld was C#, maar da's makkelijk naar VB.NET om te zetten).

Is jouw voorbeeld in je topicstart geen code uit een web-applicatie? Is het een Windows-app? Zoja, dan mag je die DataBind niet aanroepen. Dit hoef je enkel te doen in ASP.NET projecten (web projecten dus).

[ Voor 18% gewijzigd door whoami op 25-02-2003 15:01 ]

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
code:
1
2
3
4
5
6
7
8
9
10
11
Me.cmdQuery = New System.Data.SqlClient.SqlCommand()
Me.cmdQuery.CommandType = CommandType.Text
Me.cmdQuery.Connection = CN
Me.cmdQuery.CommandText = ".. zie boven .."
Dim daResources As System.Data.SqlClient.SqlDataAdapter
daResources.SelectCommand = cmdQuery
Dim dsResources As System.Data.DataSet
daResources.Fill(dsResources)
DataGrid1.DataSource = daResources
CloseDataBase()
Me.Activate()


daResources.SelectCommand = cmdQuery ==> Object reference not set to an instance of an object.

:?

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Je hebt je dataadapter nog niet gealloceerd:
code:
1
2
Dim da As SqlDataAdapter;
da = new SqlDataAdapter

https://fgheysels.github.io/


Verwijderd

Even tussendoor:

ben je data uit een E-Synergy server aan het trekken?

Die velden komen me bekend voor, al zou Exact ook overal dezelfde naamgevingen kunnen gebruiken.

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Hmf.. nog niet helemaal.. hij valt nu over daResources.Fill(dsResources).. melding The ConnectionString property has not been initialized. Raar, want die connection string van CN werkt verder wel goed.. als ik hem voor andere doeleinden gebruik.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Me.cmdQuery = New System.Data.SqlClient.SqlCommand()
Me.cmdQuery.CommandType = CommandType.Text
Me.cmdQuery.Connection = CN
Me.cmdQuery.CommandText = ".. zie boven.."
Dim daResources As System.Data.SqlClient.SqlDataAdapter
Dim dsResources As System.Data.DataSet
daResources = New System.Data.SqlClient.SqlDataAdapter()
dsResources = New System.Data.DataSet()
daResources.SelectCommand = cmdQuery
daResources.Fill(dsResources)
DataGrid1.DataSource = daResources
CloseDataBase()
Me.Activate()

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Is je connectie geopend?

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Verwijderd schreef op 25 February 2003 @ 15:18:
Even tussendoor:

ben je data uit een E-Synergy server aan het trekken?

Die velden komen me bekend voor, al zou Exact ook overal dezelfde naamgevingen kunnen gebruiken.
Erm.. das volgens mij hier dezelfde database.. de resources in e-Synergy zijn hetzelfde als in Globe 2000.

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
jepp

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Je hebt dan :
- geen connectiestring meegegeven aan je connectie object
of
- geen connectie object toegekend aan je command object.

https://fgheysels.github.io/


Verwijderd

Mephix schreef op 25 februari 2003 @ 15:21:
[...]


Erm.. das volgens mij hier dezelfde database.. de resources in e-Synergy zijn hetzelfde als in Globe 2000.
Yep. Wij zijn bijna over naar Globe 2000 :).
Over E-Synergy ben ik goed te spreken, Globe 2000 heeft nog een hoop kinderziektes. En dan bedoel ik de software kant met zn verschrikkelijk lelijke GUI.

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
whoami schreef op 25 February 2003 @ 15:23:
Je hebt dan :
- geen connectiestring meegegeven aan je connectie object
of
- geen connectie object toegekend aan je command object.
;( was het maar waar... vreemd, want die verbinding werkte met die datareader wel goed.. (nog steeds, ik gebruik die CN verbinding in meerdere forms).

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Verwijderd schreef op 25 February 2003 @ 15:24:
[...]


Yep. Wij zijn bijna over naar Globe 2000 :).
Over E-Synergy ben ik goed te spreken, Globe 2000 heeft nog een hoop kinderziektes. En dan bedoel ik de software kant met zn verschrikkelijk lelijke GUI.
e-Synergy vind ik echt top.. Globe heb ik niet zo gek veel mee te maken, maar hoor er ook niet veel negatiefs over. Hoewel.. ik zit nu op de kamer bij de exact mensen van ons en die zijn soms aardig aan het schelden aan de telefoon :D Gaat dan wel altijd over Globe.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Debug je code eens. (Stap er eens regel per regel door, bij dat stukje), en zeg eens op welke regel hij dat precies zegt....

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
daResources.Fill(dsResources)

Daar geeft ie die melding op.

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Stupid.. de OpenDataBase() functie niet aangeroepen..

Maarja, nu blijft ie op hetzelfde punt steken als met die datareader, namelijk Complex DataBinding accepts as a data source either an IList or an IListSource bij de regel "DataGrid1.DataSource = daResources"

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Mephix schreef op 25 February 2003 @ 15:52:
Stupid.. de OpenDataBase() functie niet aangeroepen..
Zie je wel.... Ik had het je toch gezegd dat je de connectie niet geopend had. :+ ;)
Maarja, nu blijft ie op hetzelfde punt steken als met die datareader, namelijk Complex DataBinding accepts as a data source either an IList or an IListSource bij de regel "DataGrid1.DataSource = daResources"


Nogmaals: is het een windows-applicatie, dan moet je die DataBind niet aanroepen. Sterker zelfs, je mag em niet aanroepen.

Ow, ik zie ook dat je je dataadapter aan de datasource toekent. Dat moet de DataSet zijn.

[ Voor 8% gewijzigd door whoami op 25-02-2003 15:54 ]

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
whoami schreef op 25 February 2003 @ 15:53:
[nohtml]
Ow, ik zie ook dat je je dataadapter aan de datasource toekent. Dat moet de DataSet zijn.
duh |:(

Thanks a lot.. hij valt nu nergens meer over.. alleen krijg ik ook geen enkele data in de grid te zien :( zijn op de goede weg :P

(damn.. waarom moesten ze zonodig met .NET aan de gang hier :/ )

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Mephix schreef op 25 February 2003 @ 16:01:
[...]


duh |:(

Thanks a lot.. hij valt nu nergens meer over.. alleen krijg ik ook geen enkele data in de grid te zien :( zijn op de goede weg :P
't Kan zijn natuurlijk dat je dataset leeg is.
(damn.. waarom moesten ze zonodig met .NET aan de gang hier :/ )


Nouhou, .NET is een goed platform hoor.

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
whoami schreef op 25 February 2003 @ 16:02:

[...]

't Kan zijn natuurlijk dat je dataset leeg is.

[...]


Nouhou, .NET is een goed platform hoor.
Sja, vermoedelijk is die dataset wel leeg ja :+ Maarruh.. vullen we die niet DataAdapter.Fill ? Die op zijn beurt weer zijn gegevens uit het SqlCommand haalt ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Mephix schreef op 25 February 2003 @ 16:13:
[...]


Sja, vermoedelijk is die dataset wel leeg ja :+ Maarruh.. vullen we die niet DataAdapter.Fill ? Die op zijn beurt weer zijn gegevens uit het SqlCommand haalt ?

Idd, maar als die SelectCommand geen gegevens teruggeeft, dan is die DataSet leeg.
Gaat het nu trouwens over een Web of een Windows applicatie?

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
whoami schreef op 25 februari 2003 @ 16:15:

[...]

Idd, maar als die SelectCommand geen gegevens teruggeeft, dan is die DataSet leeg.
Gaat het nu trouwens over een Web of een Windows applicatie?
Query Analizer geeft met dat commando gewoon de juiste data terug.. en dat stuk code is niet veranderd.

Tis trouwens een window app

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
Ben je zeker dat die DataGrid leeg is dan? Staat er niet in de eerste cel/eerste kolom een +'je ofzo?

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
groot grijs vlak..

(trouwens.. ff tussendoor heel erg bedankt voor je moeite ;) )

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-08 13:56
whoami schreef op 25 February 2003 @ 14:53:
...

Trouwens, een DataReader gebruiken in je ASP.NET page (in je presentatie-laag dus), is niet zo goed.
...
Ok...Hier ben ik het compleet mee ONEENS...

DataReader is de snelste manier om data uit een DB te halen. In een ASP.NET project met veel requests, is de datareader gewoon de beste keus om data weer te geven.

Algemen vuistregel in een ASP.NET project:

Use DataReaders where possible!

Moet je echter met de data gaan werken, dan moet je idd de datasets en datatables gaan gebruiken, maar voor het vullen van listboxes enzo, gebruik datareaders want dat scheelt nogal!

En Memphix? Probeer de database aanvragen in een andere laag te zetten, en gebruik de debug functie van VS.NET! Hiermee kan je met F11 door je code stappen omzo te kijken of een datareader/set/table wel gevuld wordt en welke data deze bevat!

Suc6

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

gorgi_19

Kruimeltjes zijn weer op :9

Ik neem aan dat als het veelgebruikte data is, je beter kan kijken naar caching.

Verder heeft whoami het iig over datareader in je presentatielaag. Als je een complete mix-up wilt van code, moet je dit vooral doen. Anders heeft een enige businessrule imho weinig niets te doen in de presentatielaag.

Verder gebruikt hij de sqldatareader. Lijkt me niet dat je deze in je businesslaag wil hebben. Stel je wilt een andere db gebruiken? Kan je je gehele code doorlopen en controleren.

Een sqldatareader zal ongetwijfeld sneller zijn, maar ik vraag me serieus af of dit de onderhoudbaarheid van je code ten goede komt.

[ Voor 38% gewijzigd door gorgi_19 op 25-02-2003 16:37 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Heren.. niet vechten :P

Nnway, ik kan erg goed uit de voeten met die datareader.. vooral omdat ie zo simpel is (je kan er dan ook minder mee.. maar mijn app hoeft niet in de e-Synergy database te schrijven, alleen klanten weer te geven... selecteren en dan faxnummer pakken om te gaan faxen.

Maargoed, in vb.net is het dus niet mogelijk om data uit een datareader in een datagrid te stoppen :(

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

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 is af en toe graag fel, en PT kent me onderhand wel.. :+
Nnway, ik kan erg goed uit de voeten met die datareader.. vooral omdat ie zo simpel is (je kan er dan ook minder mee.. maar mijn app hoeft niet in de e-Synergy database te schrijven, alleen klanten weer te geven... selecteren en dan faxnummer pakken om te gaan faxen.

Maargoed, in vb.net is het dus niet mogelijk om data uit een datareader in een datagrid te stoppen :(
Je kan sowieso eens kijken op http://www.asp.net/tutorials/quickstart.aspx voor wat voorbeelden.. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:47
[nohtml]
PhoneTech schreef op 25 February 2003 @ 16:29:
[...]


Ok...Hier ben ik het compleet mee ONEENS...

DataReader is de snelste manier om data uit een DB te halen. In een ASP.NET project met veel requests, is de datareader gewoon de beste keus om data weer te geven.
Een datareader is de snelste manier, inderdaad....
Maar... als je gebruik maakt van een n-tier architectuur (wat je eigenlijk zou moeten doen als je een web-app ontwikkeld), en je gebruikt datareaders in je presentatie-laag, dan is je hele n-tier structuur naar de knoppen. Je zult dan namelijk je datareader, je open en close connectie etc binnen de presentatie-laag oproepen. Maw, je zit dan eigenlijk je datalaag in je presentatielaag te verweven.
Algemen vuistregel in een ASP.NET project:

Use DataReaders where possible!
Waar heb je die vuistregel vandaan?
Moet je echter met de data gaan werken, dan moet je idd de datasets en datatables gaan gebruiken, maar voor het vullen van listboxes enzo, gebruik datareaders want dat scheelt nogal!
Ik denk niet dat het verschil met het blote oog merkbaar zal zijn.
Een DataSet gebruikt trouwens intern ook een datareader bij het opvullen van de data.
En Memphix? Probeer de database aanvragen in een andere laag te zetten, en gebruik de debug functie van VS.NET! Hiermee kan je met F11 door je code stappen omzo te kijken of een datareader/set/table wel gevuld wordt en welke data deze bevat!
Ow, dus je gaat toch voor een meer-lagen structuur? Hoe wil je dat goed doen als je data logica in je presentatielogica zet, want dat doe je mbhv die datareaders.

https://fgheysels.github.io/


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 22-08 13:56
whoami schreef op 25 February 2003 @ 16:45:
[nohtml]
[...]

Een datareader is de snelste manier, inderdaad....
Maar... als je gebruik maakt van een n-tier architectuur (wat je eigenlijk zou moeten doen als je een web-app ontwikkeld), en je gebruikt datareaders in je presentatie-laag, dan is je hele n-tier structuur naar de knoppen. Je zult dan namelijk je datareader, je open en close connectie etc binnen de presentatie-laag oproepen. Maw, je zit dan eigenlijk je datalaag in je presentatielaag te verweven.


[...]

Waar heb je die vuistregel vandaan?

http://samples.gotdotnet....pplus/doc/perftuning.aspx
En dan regel 12


[...]

Ik denk niet dat het verschil met het blote oog merkbaar zal zijn.
Een DataSet gebruikt trouwens intern ook een datareader bij het opvullen van de data.


[...]

Ow, dus je gaat toch voor een meer-lagen structuur? Hoe wil je dat goed doen als je data logica in je presentatielogica zet, want dat doe je mbhv die datareaders.
Hier heb je idd een punt. Ik loop nu wel te lullen dat je datareaders moet gebruiken terwijl ikzelf dat eigenlijk niet doe! 8)7

Maar het is wel mogelijk met meerdere tiers, maar je zult dan overal
code:
1
2
using System.Data.SqlTypes;
using System.Data.SqlClient;


moeten gebruiken...En dan is het niet meer echt gescheiden

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

gorgi_19

Kruimeltjes zijn weer op :9

PhoneTech schreef op 25 februari 2003 @ 17:01:
Maar het is wel mogelijk met meerdere tiers, maar je zult dan overal
code:
1
2
using System.Data.SqlTypes;
using System.Data.SqlClient;


moeten gebruiken...En dan is het niet meer echt gescheiden
Dan nog.. Stel je gebruikt geen SQL Server database meer.... :P Hoe ga je het dan oplossen? O-)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
PhoneTech schreef op 25 February 2003 @ 17:01:
[...]

Maar het is wel mogelijk met meerdere tiers, maar je zult dan overal
code:
1
2
using System.Data.SqlTypes;
using System.Data.SqlClient;


moeten gebruiken...En dan is het niet meer echt gescheiden
Persoonlijk hanteer ik de vuistregel dat bovenstaande namespaces nooit in de presentatielaag voor mogen komen. Op het moment dat je deze toch in je code-behind of formcode aan het intypen bent zou er iets moeten gaan jeuken :).
Voor de rest maakt het me niet zo veel uit. De echte (OO) purist zou ook geen System.Data in de presentatie willen gebruiken maar zo ver wil ik niet gaan.

Cuyahoga .NET website framework


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11-2025
Sorry voor de mensen die dit topic via de Search nog es opzoeken.. maar de data vanuit de datareader naar een datagrid is me dus niet gelukt. Ik heb de volgende code gebruikt om via een dataset gegevens vanuit de SQL server naar het grid te krijgen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim cmdQuery As System.Data.SqlClient.SqlCommand
Dim DataAdapter As System.Data.SqlClient.SqlDataAdapter
Dim DataSet As System.Data.DataSet

cmdQuery = New System.Data.SqlClient.SqlCommand()
cmdQuery.CommandText = "SELECT cmp_code, cmp_name, cmp_fCity, cmp_tel, cmp_fax FROM cicmpy ORDER BY cmp_name"
cmdQuery.CommandType = CommandType.Text
cmdQuery.Connection = CN 'connectionstring, staat in een method file.
CN.Open()
DataAdapter = New System.Data.SqlClient.SqlDataAdapter(cmdQuery)
DataAdapter.TableMappings.Add("Table", "cicmpy")
DataSet = New System.Data.DataSet()
DataAdapter.Fill(DataSet)
DataGrid1.DataSource = DataSet.Tables(cicmpy)
CloseDataBase()


Enne, die "Table" in de tablemappings van de dataadapter.. das een default waarde, mocht je je afvragen waar ik die vandaan haal

Ik laat het hier voorlopig maar bij.. ik heb nu tenminste een mooi read-only datagrid met de gegevens die ik wilde hebben.

Thanks all.. enne, wat mij betreft is dit topic af :+

[ Voor 3% gewijzigd door Mephix op 26-02-2003 15:45 ]

Pagina: 1