Toon posts:

[ASP.net/OleDb] Weergave database gegevens uit twee tabellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

Ik programmeer zelf vooral in PHP icm mysql; en weet daarmee wel hoe ik een script kan schrijven voor mijn pagina, maar nu moet het in .aspx, en ik heb e.e.a. opgebouwd met visual basic .net als taal.

Mijn vraag is eigenlijk hoe je in ASP..net & VB een whilelus in een while lus kan verwerken (dus twee while lussen met gegevens uit een database). E.e.a. verduidelijk ik in het onderstaande...

Situatie:
Ik heb 2 tabellen in mijn database staan: 1 voor de categorieën en 1 voor de titel van allerlei artikelen. In de weergave, moet het zo zijn dat je een overzichtspagina hebt, waarbij het script
- eerst de categorie met id=1 in beeld brengt (bijvoorbeeld vetgedrukt omdat het een categorie is)
- vervolgens alle titels van artikelen in beeld brengt die in die categorie horen.
- vervolgens de titel van categorie 2 in beeld brengt met ook daarbij weer de bijbehorende titels van die categorie, enzovoort enzovoort.
Ik wilde in de artikelen tabel dan een kolom maken met een categorienummer die correspondeert met het 'id' (kolom) van de tabel met de artikelen zodat je daar bijvoorbeeld een JOIN van kan maken, of anderzins kan gebruiken in een sql-query (dat is dus de relatie tussen de twee tabellen).

in php zou ik zoiets maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//verbinding etc, laat ff buiten  beschouwing
$sql="SELECT id, naam FROM categorieen order by id ASC";
$result = mysql_query($sql) or die (mysql_error());
if(mysql_num_rows($result)==0)
 {
 die('Er zijn geen categorieen gedefinieerd') 
 }
while (record=mysql_fetch_assoc($result))
 {/*id van een categorie is bekend
 hier per id eerst de titel weergeven van de categorie, en dan alle artikelen */
 echo '<h1>'.$record['naam'].'</h1>';
   $query="SELECT id, titel FROM artikelen WHERE id=".$record['id'];
   $resultaten=mysql_query($query) or die(mysql_error());
   while($aRecord=mysql_fetch_assoc($resultaten))
      {//weergave titels uit deze categorie
        echo '<p>'.$aRecord['titel'].'</p';
      }
 }

de php code is niet getest, maar ik hoop dat daarmee duidelijker wordt, wat ik in gedachten heb. Volgens mij zou deze phpcode, doen wat ik wil (mits de db gevuld is e.d.).

Ik ben verder nog vrij nieuw in ASP.net; heb het boek basiscursus ASP.net doorgewerkt, maar kom daarmee niet echt uit dit probleem. Punt is dat in .net de code strikt gescheiden is van de weergave. Dat is in mijn phpscriptje, niet zo, daar heb ik al een echo gedaan, en vrolijk selecteer ik daarna nog e.e.a., en geef ik dat dmv een echo weer.

Ik kom er priima uit om alle categorieen in asp.net weer te geven, of om alle artikelen weer te geven (en op te maken etcetera), maar om die twee te mixen, is voor mij een probleem.

Hoe kan ik dat doen?

Ik zit nu met het volgende stukje script:

Visual Basic .NET:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<%@ Page Language="VB" debug="true" ContentType="text/html" ResponseEncoding="iso-8859-1" %>
<%@ import Namespace="System.Data.OleDb" %>

<script runat="server">
'verbinding met de database rr (rr)
Dim Conrr AS OleDbConnection
Dim ConnectionString As String = "connectiestring weg gelaten hier, maar die klopt wel... ik kan dingen doen met de database..."
Dim cmdSelectarticles As OleDbCommand

'datareader die de gegevens gaat bevatten
Dim dtrResearchreport AS OleDbDataReader

Sub Page_Load()

Dim SQLString AS string ="SELECT id, category FROM category order by id ASC"
'verbinding leggen en openen
Conrr = New OleDbConnection (ConnectionString)
Conrr.Open()
'SQL statement uitvoeren op de verbinding Conrr
CmdSelectarticles=New OleDbCommand(SQLString, Conrr)

'datareader aanmaken

dtrResearchreport  = cmdSelectarticles.ExecuteReader()


bdtitles.DataSource=dtrResearchReport
bdtitles.Databind()
dtrResearchreport.Close()
Conrr.Close()


End Sub

</script>
<html>
<head>
<link rel="stylesheet" href="styles.css" type="text/css">
</head>
<body bgcolor="#000080" link="#FFFFFF" vlink="#FFFFFF" alink="#FFFF00" leftmargin="100" rightmargin="100">
<asp:Repeater id="bdtitles" runat="server" >
        <ItemTemplate>
- <a href="viewarticle.aspx?id=<%# Container.DataItem ("category") %>"><%# Container.DataItem ("category") %></a> 
 <br>
    </ItemTemplate>
</asp:Repeater>

</script>

</script>
</body>
</html>

Dit stuk script brengt dus alleen de categorieën in beeld, maar niet de titels. Ik zou ook niet weten hoe ik dit ertussen kan krijgen. Welke methoden moet ik gebruiken?

Heeft iemand een goede verwijzing / goede tip?

Het zit em denk ik in het stukje
dtrResearchreport = cmdSelectarticles.ExecuteReader()
Je stopt alles in die datareader, en dan kan ik de artikelen niet meer toevoegen.
Iemand tips?

[ Voor 20% gewijzigd door Verwijderd op 06-03-2005 22:57 ]


Verwijderd

Als je het zou willen dan kun je inderdaad zoals je het hebt gedaan alle code (gecombineerde asp.net/vb.net en html) in een enkel bestand neerzetten zodat je geen .dll meer nodig hebt. In dat geval kun je de code bijna één-op-één vertalen zoals je die nu ook in PHP hebt.

In het andere geval kun je gebruik maken van code behind en de kracht van aps.net-componenten en de asp.net code scheiden van de html-pagina en deze in het .vb-bestand neerzetten. In dat geval heb je ook de beschikking over o.m. code completion.

Verwijderd

Topicstarter
Ik snap alleen niet hoe ik dat kan doen.
Ik maakt een datareader aan, en bind die aan een asp.net control (of repeater) en dan komt voor die ene query, het resultaat in beeld (alleen de categorieen). Hoe ik hier de titels bij in kan zetten, weet ik niet. Misschien is het wel heel simpel.

Zou je kunnen zeggen met welke functies ik zou moeten werken?
Of op welke termen ik op zoiets kan zoeken, om me deze techniek aan te leren?

Ik kan nu niet verzinnen hoe ik het moet doen...

Op msdn en andere sites, zie ik wel voorbeelden om e.e.a. met 'multiple resultsets' weer te geven; maar als ik meerdere queries in 1 string wil zetten, zegt de parser: 'Characters found after end of SQL statement' dus het lijkt erop dat ik niet meerdere queries kan uitvoeren in 1 keer (of ik doe iets anders fout...).

[ Voor 26% gewijzigd door Verwijderd op 07-03-2005 00:00 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 10-05 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Meest eenvoudig lijkt me om een DataList te gaan nesten in een ItemTemplate van een DataList.

De items lees je in 1x in en stop je in een Hashtable; met als key de ID en als Value wederom een arraylist, waarin je de individuele items neer zet.

Die hashtable kan je vervolgens cachen of je kan de pagina een Outputcache geven.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Folkert
  • Registratie: September 2001
  • Laatst online: 10:26
Je kan eenvoudig repeater in repeater plaatsen, of een datagrid in een datagrid. Ga maar zoeken naar 'nested repeaters' en datarelation... werkt vrij eenvoudig...

http://www.wimdows.net/articles/article.aspx?aid=19

[ Voor 18% gewijzigd door Folkert op 07-03-2005 09:02 ]


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 08:41
Misschien handiger is om 2 datasets uit te lezen, en dan een relatie te maken met de 2 datasets.
Hier een voorbeeldje:
http://www.dotnetspider.com/technology/kbpages/758.aspx

The best thing about UDP jokes is that I don't care if you get them or not.


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
Remc0 schreef op maandag 07 maart 2005 @ 09:03:
Misschien handiger is om 2 datasets uit te lezen, en dan een relatie te maken met de 2 datasets.
Hier een voorbeeldje:
http://www.dotnetspider.com/technology/kbpages/758.aspx
1 Data-Set bedoel je met 2 datatables en een data-relation in ? :P

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 08:41
whoami schreef op maandag 07 maart 2005 @ 09:13:
[...]
1 Data-Set bedoel je met 2 datatables en een data-relation in ? :P
Dat mag ook.. :X

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
Ik ga er zo snel mogelijk mee aan de slag. Ik moet zeggen dat het nog een beetje abra ca dabra is; maar met deze tips, heb ik weer termen om wat te googlen en om de internet links / voorbeelden te checken. Zodra ik e.e.a. heb geprobeerd laat ik weten of het is gelukt, of juist niet, en waar het mis gaat.

bedankt voor de reacties.

Verwijderd

Topicstarter
Het wil nog niet echt lukken. Ik heb geprobeerd zoveel mogelijk de links te volgen en aan de hand daarvan te googlen, maar ik kan nog niet echt overweg met al die datalists/datasets/databinding technieken etcetera.

Aan de hand van wat ik heb gelezen dacht ik het volgende:
ik heb 2 tabellen
researchreport
velden:
- id (primaire sleutel)
- program (komt overeen met category; het nummer (integer) dat deze heeft, correspondeert met het veld 'category' uit de gelijknamige tabel.
- nog een aantal velden

category
velden:
- category (tekst)
- id (primaire key en direct ook het veld dat met program gekoppeld moet worden)

Ik dacht (aan de hand van meerdere voorbeelden):
- maak 1 dataset (DS)
- maak 2 DataAdapters die in de DataSet moeten komen
- maak een relatie via DS.Relation.Add
- haal op een of andere manier de juiste gegevens uit de tabel (bijvoorbeeld door uit de dataset, de integer van het veld 'program' uit de tabel 'researchreport', te vervangen door de tekst die hierbij hoort, uit de tabel category)
- geef dat dan dmv een repeater oid weer in het weergave gedeelte.

Ik loop nu ongeveer vast bij het maken van de relatie; en zal mijn code posten:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ Page Language="VB" debug="true" ContentType="text/html" ResponseEncoding="iso-8859-1" %>
<%@ import Namespace="System.Data.OleDb" %>
<%@ import Namespace="System.Data" %>
<script runat="server">
Dim Con As OleDbConnection
Dim DA As OleDbDataAdapter
Dim DS As DataSet

Sub page_load()
Con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data source=d:\www\blaat.nl\blaat.mdb;")
DA = New OleDbDataAdapter("select * from researchreport", Con)
DS = New DataSet()
DA.Fill(DS, "researchreport")

DA = New OleDbDataAdapter("select * from category", Con)
DA.Fill(DS, "contentcategory")
DS.Relations.Add("combinatie", DS.Tables["category"].Columns["progream"], DS.Tables["researchreport"].Columns["id"], false);



End Sub
</script>

Hij geeft dan al een error (na het proberen om de relatie toe te voegen in regel 17, dus daar is iets mis mee.

Verder, snap ik ook niet precies, hoe ik dan de gegevens straks, goed weergegeven ga krijgen. Ik loop dus al eerder vast in mijn stappenplan, maar weet ook niet precies hoe ik de gegevens kan gaan weergeven als straks de relatie er wel is. Wat ik heb begrepen, is de dataAdapter ervoor bedoeld om gegevens in de dataset te krijgen. De dataset is een plaats waarin gegevens geladen zijn. Als het goed is, heb ik nu (zonder regel 17) dus 2 tabellen in mijn dataset. Daarmee zijn er genoeg gegevens om e.e.a. op scherm weer te geven, maar hoe ik dat kan doen weet ik echt even niet.

Als gezegd wordt wat ik zelf dacht; dat het vrij makkelijk zou moeten kunnen, zou iemand misschien dmv wat voorbeelden, me wat in de goede richting kunnen duwen? Ik heb de hele middag al lopen zoeken / proberen / testen maar kom niet verder; terwijl ik in php maar een paar regels code nodig heb...

[ Voor 21% gewijzigd door Verwijderd op 07-03-2005 16:23 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:19
Verwijderd schreef op maandag 07 maart 2005 @ 16:19:
Ik dacht (aan de hand van meerdere voorbeelden):
- maak 1 dataset (DS)
- maak 2 DataAdapters die in de DataSet moeten komen
Een data-adapter komt niet in een dataset, maar gebruik je om een dataset op te vullen.
Je kan een dataset opvullen met 1 data-adapter.

code:
1
- maak een relatie via DS.Relation.Add

code:
1
DS.Relation.Add ("naam", DS.Tables[0].Columns["naam_pk_column"], DS.Tables[1].Columns["naam_fk_clumn"]);
Hij geeft dan al een error (na het proberen om de relatie toe te voegen in regel 17, dus daar is iets mis mee.
Welke error ? Ben je er zeker van dat je de columns in de goeie volgorde gezet hebt in je Data-Relation ? Kijk eens naar de help die te vinden is voor de constructor van de DataRelation class.
Verder, snap ik ook niet precies, hoe ik dan de gegevens straks, goed weergegeven ga krijgen. Ik loop dus al eerder vast in mijn stappenplan, maar weet ook niet precies hoe ik de gegevens kan gaan weergeven als straks de relatie er wel is. Wat ik heb begrepen, is de dataAdapter ervoor bedoeld om gegevens in de dataset te krijgen. De dataset is een plaats waarin gegevens geladen zijn. Als het goed is, heb ik nu (zonder regel 17) dus 2 tabellen in mijn dataset. Daarmee zijn er genoeg gegevens om e.e.a. op scherm weer te geven, maar hoe ik dat kan doen weet ik echt even niet.
Een DataRow heeft een method 'GetChildRows'; maar het zou goed kunnen zijn dat die repeater / grid zelf al zorgt voor het goed weergeven van jouw data, omdat ie ziet dat er een relatie bestaat tussen de 2 tabellen in je dataset.

https://fgheysels.github.io/

Pagina: 1