Archief - [PROG]ASP.net SQL Subselect

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

f00raap

Legacy Member
Beste teleneters, programmers

Mijn probleem:
Hoe SQL subselect toepassen in asp.net? Maat van mij zij met meerdere SQL..
Ik heb een dropdownlist waar alle auteurs in staan.
Wat er moet gebeuren:
Als je een auteur selecteerd moet er in een grid de alle boeken van die auteur komen. Deze velden moeten in de grid komen:
ISBN nummer
Titel
Naam van de uitgever
Aantal blz.


Mijn sql:
strSQL = "Select ISBNNUMMER,TITEL,AANTAL_BLZ from BOEK where ISBNNUMMER IN (SELECT ISBNNUMMER from BOEK_AUTEUR where A_NUMMER IN(SELECT A_NUMMER from AUTEUR where A_NAAM= '" & lstAuteurs.SelectedValue & "' ))& ;"

Hoe ik die uitgevernaam moet tonen weet ik niet.. Maar wat ik hier juist zeg is access hoe doe je dit nu is asp.net??

Vorm DataBase BIBLIOTHEEK:
AUTEUR:
A_NUMMER
A_NAAM
A_PLAATS
BOEK:
ISBNNUMMER
TITEL
U_NUMMER
JR_VAN_UITGAVE
AANTAL_BLZ
BOEK_AUTEUR:
ISBNNUMMER
A_NUMMER
UITGEVER:
U_NUMMER
U_NAAM
U_PLAATS

Alvast bedankt voor de hulp:)

f00raap

Bubbling Zombie

Legacy Member
zou je nie beter een event maken, en in die event dan like het object uit de drop down list ophalen, en aan de hand van dat object een zoekopdracht maken?

duuus, ge vult uw lijstje (select * from auteur), en dan als ge een andere acteur gaat aanduiden fired ge nen event (select <gerief da ge nodig hebt> from <tabellekes> where a_nummer := selectitem.a_nummer)

trouwens, kleine opmerking: je kan best bij je databasetabellen een primary key definieren die nietszeggend is. boekID en dergelijke.

Radiance

Legacy Member
Bubbling Zombie zei:
trouwens, kleine opmerking: je kan best bij je databasetabellen een primary key definieren die nietszeggend is. boekID en dergelijke.
Noot aan de topicstarter : je doet dit enkel niet bij de tabel boeken, ik veronderstel omdat je er vanuit gaat dat het ISBN nummer sowieso uniek is? Dat klopt, maar wat als iemand een verkeerd ISBN nummer ingeeft ? Er worden meteen enkele relaties gelegd naar de auteur/uitgever & dat zal je dus ook moeten voorzien in een eventuele edit functie. Gebruik bij voorkeur dus idd een boekID.

Bubbling Zombie zei:
zou je nie beter een event maken, en in die event dan like het object uit de drop down list ophalen, en aan de hand van dat object een zoekopdracht maken?
Hij heeft het over ASP.NET, daar heb je geen events veronderstel ik.

Wat je gaat moeten doen is iemand een auteur laten selecteren, en daarna op een knop laten drukken waardoor het formuliertje waar beiden instaan gebsubmit wordt (evt. met JS ook zonder button op te lossen). Je kan nu de POST variablen ophalen. Je dropdown stel je trouwens best alsvolgt op:
HTML:
<select name="auteur">
  <option value="75">Herman Brusselmans</option>
</select>
Waarbij 75 uiteraard het auteur id van Herman Brusselmans is.
In PHP zou $_POST['auteur'] nu het nummer 75 bevatten, in ASP zal het wel gelijkaardig werken.

Als ik mij niet vergis kan de SQL er ongeveer als volgt uitzien:
Code:
SELECT boek.ISBN, boek.titel, boek.aantal_blz, uitgever.naam 
FROM (boek LEFT JOIN uitgever ON (boek.u_nummer=uitgever.u_nummer)) 
RIGHT JOIN boek_auteur ON (boek.ISBN=boek_auteur.ISBN)
WHERE boek_auteur.a_nummer = $_POST['auteur']

Feel free to correct.

P.S.: Als je iets gelijkaardig aan hierboven doet vergeet dan niet de input te controleren, beveliging tegen oa. SQL injectie (hoewel dit een overhypt probleem is neem je toch best je voorzorgen).

Bubbling Zombie

Legacy Member
Radiance zei:
Hij heeft het over ASP.NET, daar heb je geen events veronderstel ik.
link

ik zou eens rondkijken in uw codebehind

Kan je trouwens niet heel je object meegeven, en dan uw naam laten zien? Dan kan je vergelijken adhv het object, wat handiger is als je't later wilt implementeren met behulp van nHibernate of een dergelijke ORM oplossing. En beter qua code, en dergelijke.

f00raap

Legacy Member
Merci voor de uitleg alvast! Dit is de code die ik nu heb.
Ik selecteer uit de listbox een auteur(bindlist) dan word deze opgevuld in de bindgrid. Mijn probleem is dat ik niet goed weet hoe ik een subselect in asp.net maak. In Access kan ik dit wel degelijk! En er zijn primaire sleutels gelegd :
Bij tabel boeken:
op isbnnummer
Bij tabel auteur:
op a_nummer
Bij tabel uitgever:
op u_nummer
Bij tabel boek_auteur:
ISBNNUMMER
A_NUMMER

Code:
Public Class WebForm1
    Inherits System.Web.UI.Page
    Dim connStr As String
    Dim strSQL As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        connStr = System.Configuration.ConfigurationSettings.AppSettings("connStr")
        If Not Page.IsPostBack Then
            bindlist()
        End If
    End Sub
   [COLOR="YellowGreen"] Private Sub bindlist()
        Dim objCn As OleDb.OleDbConnection = New OleDb.OleDbConnection(connStr)
        objCn.Open()

        Dim objCmd As OleDb.OleDbCommand = New OleDb.OleDbCommand
        objCmd.CommandType = CommandType.Text
        objCmd.CommandText = "Select * from AUTEUR ORDER BY A_NAAM ASC;"
        objCmd.Connection = objCn

        Dim objRead As OleDb.OleDbDataReader = objCmd.ExecuteReader(CommandBehavior.CloseConnection)

        lstAuteurs.DataSource = objRead
        'Wa je moet tonen
        lstAuteurs.DataTextField = "A_NAAM"
        'Id
        lstAuteurs.DataValueField = "A_NUMMER"
        lstAuteurs.DataBind()
    End Sub[/COLOR]

 [COLOR="Orange"]   Private Sub bindgrid()
        Dim objCn As OleDb.OleDbConnection = New OleDb.OleDbConnection(connStr)
        objCn.Open()

        strSQL = "Select ISBNNUMMER,TITEL,AANTAL_BLZ,U_NAAM  from AUTEUR,BOEK,UITGEVER where AUTEUR.A_NUMMER=" & lstAuteurs.SelectedIndex

        If viewstate("var") = "" Then
            strSQL &= ";"
        Else
            strSQL &= " order by " & viewstate("var") & ";"
        End If

        Dim objDa As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(strSQL, objCn)
        Dim objDS As DataSet = New DataSet

        objDa.Fill(objDS)

        grdBoeken.DataSource = objDS
        grdBoeken.DataBind()

        objCn.Close()
    End Sub
[/COLOR]
    Private Sub lstAuteurs_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstAuteurs.SelectedIndexChanged
        bindgrid()
    End Sub

    Private Sub grdBoeken_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles grdBoeken.PageIndexChanged
        grdBoeken.CurrentPageIndex = e.NewPageIndex
        bindgrid()
    End Sub

    Private Sub grdBoeken_SortCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles grdBoeken.SortCommand
        grdBoeken.CurrentPageIndex = 0
        viewstate("var") = e.SortExpression
        bindgrid()
    End Sub

Als ik nu een auteur selecteer krijg ik alle boeken. Ik wil alleen de Boeken Van de auteur die ik selecteer.

strSQL = "Select ISBNNUMMER,TITEL,AANTAL_BLZ,U_NAAM from AUTEUR,BOEK,UITGEVER where AUTEUR.A_NUMMER=" & lstAuteurs.SelectedIndex

Bubbling Zombie

Legacy Member
strSQL = "Select ISBNNUMMER,TITEL,AANTAL_BLZ,U_NAAM from AUTEUR,BOEK,UITGEVER where AUTEUR.A_NUMMER=" & lstAuteurs.SelectedIndex

maakt es van da laatste eens lstActeurs.SelectedValue

(ofzoiets, 't is laat, kzijn ne film aant zien, etc)

f00raap

Legacy Member
Geef nog hetzelfde alle boeken weer ..! Maar selected value is niet logisch.
Value=Geeft waarde terug bv Herman Brusselmans
Index=nummerke

where AUTEUR.A_NUMMER=" & lstAuteurs.SelectedIndex

duz dan is dit toch logischer.

Hij moet gwn de boeken tonen in een grid van de auteur die ik selecteer in de lijst.

f00raap

Legacy Member
Bedankt Bubbling Zombie , Radiance! Ik heb nu de sql kunnen oplossen en hij werkt!
Topic closed!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan