Archief - ASP.NET SQL probleem

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.

Piecemaker

Legacy Member
Ik ben voor een taak voor school een projectje aan het maken: we moeten een datingsite maken, ben momenteel bezig met het zoekscherm: er moeten een hoop parameters ingevuld worden zodat er gezocht kan worden naar overeenkomstige profielen.

Er zijn een 20tal parameters dus ik bouw de query parameter per parameter op, tot nu toe werkt het goed, ik kan al zoeken op: geslacht, regio, woonplaats, oogkleur, haarkleur, haarsnit, ... Allemaal redelijk eenvoudig dus.

Maar op het zoekformulier heb ik dus ook zoektermen zoals: Burgerlijke staat, persoonlijkheid, beroep, ... Hier kan ik meerdere keuzes tegelijk maken (checkboxen). Als ik dus bijvoorbeeld bij beroep zowel arbeider als bediende aanvink, moeten dus alle profielen getoond worden die arbeider of bediende zijn.

Al de zoekcriteria met meerdere opties steek ik dus in een generic list, bv: Dim burgerlijkeStaat As New Generic.List(Of String).

Hoe moet ik dit nu in mijn query doen? Tot hiertoe heb ik het volgende:

Code:
 Public Shared Function findAbonnementIDByZoektermen(ByVal geslacht As Integer, ByVal regio As Integer, ByVal zoekvoor As Integer, ByVal minLeeftijd As Integer, ByVal maxLeeftijd As Integer, ByVal burgerlijkeStaat As Generic.List(Of String)) As OleDbDataReader

        Try
            Dim cts As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("DB")
            Dim con As New OleDbConnection(cts.ConnectionString)
            Dim cmd As New OleDbCommand("SELECT PersoonlijkeInfo.AbonnementID FROM PersoonlijkeInfo, WoonplaatsRegio, VoorkeurInfo, BurgerlijkeStaat " & _
                                        "WHERE PersoonlijkeInfo.GeslachtID=@geslacht AND " & _
                                        "WoonplaatsRegio.RegioID=@regio AND " & _
                                        "VoorkeurInfo.TypeID=@zoekvoor AND " & _
                                        "PersoonlijkeInfo.GeboorteDatum >= @minDatum AND " & _
                                        "PersoonlijkeInfo.GeboorteDatum <= @maxDatum AND " & _
                                        "BurgerlijkeStaat.Omschrijving IN @burgerlijkestaat AND " & _
                                        "PersoonlijkeInfo.WoonplaatsID=WoonplaatsRegio.WoonplaatsID AND " & _
                                        "PersoonlijkeInfo.AbonnementID=VoorkeurInfo.AbonnementID AND" & _
                                        "PersoonlijkeInfo.BurgerlijkeStaatID=BurgerlijkeStaat.BurgerlijkeStaatID")

            cmd.Parameters.AddWithValue("@geslacht", geslacht)
            cmd.Parameters.AddWithValue("@regio", regio)
            cmd.Parameters.AddWithValue("@zoekvoor", zoekvoor)
            cmd.Parameters.AddWithValue("@minDatum", Date.Today.AddYears(-maxLeeftijd))
            cmd.Parameters.AddWithValue("@maxDatum", Date.Today.AddYears(-minLeeftijd))
            cmd.Parameters.AddWithValue("@burgerlijkestaat", burgerlijkeStaat)

            cmd.Connection = con
            con.Open()
            Return cmd.ExecuteReader(CommandBehavior.CloseConnection)

        Catch ex As Exception

        End Try

        Return Nothing

    End Function

dit werkt dus niet, krijg een of andere foutmelding dat er geen generic in een query mag staan. Ook al geprobeerd met een gewone array, maar gaat blijkbaar ook niet.

Iemand een idee?

apa

Legacy Member
Gebruik een array van strings i.p.v. een generieke lijst. Die array kan je vervolgens join-en tot een enkele string die je kan gebruiken in een LIKE-statement. Ik doe mijn best om het hier in VB.NET te schrijven (maar ben meer gewend om met C# te werken):
Code:
 Public Shared Function findAbonnementIDByZoektermen(ByVal geslacht As Integer, ByVal regio As Integer, ByVal zoekvoor As Integer, ByVal minLeeftijd As Integer, ByVal maxLeeftijd As Integer, ByVal burgerlijkeStaat As String()) As OleDbDataReader

        Try
            Dim cts As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("DB")
            Dim con As New OleDbConnection(cts.ConnectionString)
            Dim cmd As New OleDbCommand("SELECT PersoonlijkeInfo.AbonnementID FROM PersoonlijkeInfo, WoonplaatsRegio, VoorkeurInfo, BurgerlijkeStaat " & _
                                        "WHERE PersoonlijkeInfo.GeslachtID=@geslacht AND " & _
                                        "WoonplaatsRegio.RegioID=@regio AND " & _
                                        "VoorkeurInfo.TypeID=@zoekvoor AND " & _
                                        "PersoonlijkeInfo.GeboorteDatum >= @minDatum AND " & _
                                        "PersoonlijkeInfo.GeboorteDatum <= @maxDatum AND " & _
                                        "BurgerlijkeStaat.Omschrijving IN @burgerlijkestaat AND " & _
                                        "PersoonlijkeInfo.WoonplaatsID=WoonplaatsRegio.WoonplaatsID AND " & _
                                        "PersoonlijkeInfo.AbonnementID=VoorkeurInfo.AbonnementID AND" & _
                                        "'|' + @burgerlijkestaat + '|' LIKE '%|' + PersoonlijkeInfo.BurgerlijkeStaatID + '|%'")

            cmd.Parameters.AddWithValue("@geslacht", geslacht)
            cmd.Parameters.AddWithValue("@regio", regio)
            cmd.Parameters.AddWithValue("@zoekvoor", zoekvoor)
            cmd.Parameters.AddWithValue("@minDatum", Date.Today.AddYears(-maxLeeftijd))
            cmd.Parameters.AddWithValue("@maxDatum", Date.Today.AddYears(-minLeeftijd))
            cmd.Parameters.AddWithValue("@burgerlijkestaat", burgerlijkeStaat.Join("|"))

            cmd.Connection = con
            con.Open()
            Return cmd.ExecuteReader(CommandBehavior.CloseConnection)

        Catch ex As Exception

        End Try

        Return Nothing

    End Function
Qua performance is dit niet top, maar het bereikt wel wat je wil...
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