[VB.NET] Zoeken in dataset

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

  • MikevanEngelen
  • Registratie: Mei 2001
  • Laatst online: 22-05 14:39
Beste mensen ik ben nu al een poos bezig maar ik kom er niet uit.
Ik maak gebruik van de ByteFX mysql connector om gebruik te maken van een MySQL database. De connectie maken enz werkt allemaal perfect.

Echter nu probeer ik te zoeken in door de gegevens van de dataset. Het gaat om een gebruikersnaam die ik wil zoeken, zodat hij dan de row selecteerd met de goede gebruikersnaam, en zodra hij em niet vind hij false terug geeft.
Ik probeer het met de volgende code dmv een dataview:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Function FilterInloggen()
        Try
            dbview_login.Table = dbdataset.Tables("users")
            dbview_login.Sort = "gebruikersnaam"
            dbrecnr_login = dbview_login.Find(dbvar_login)
            res_login_id = dbview_login(dbrecnr_login).Item("userid")
            res_login_gn = dbview_login(dbrecnr_login).Item("gebruikersnaam")
            res_login_ww = dbview_login(dbrecnr_login).Item("wachtwoord")
            res_login_re = dbview_login(dbrecnr_login).Item("rechten")
            res_login_ta = dbview_login(dbrecnr_login).Item("taal")
            Return True
        Catch
            Return False
        End Try
    End Function


dbvar_login is de string wat direct uit een tekstbox komt.
Kan iemand mij hierop weg helpen, of een voorbeeld geven hoe hij/zij door een database zoekt (of eigelijk de dataset, datatable oid).

Het belangrijkste in mijn geval is dus dat ik de "userid" terug krijg.
Echter hij loopt op het stukje "dbrecnr_login = dbview_login.Find(dbvar_login)" stapt hij door naar return false (dus dat catched hij em af).

Iemand een idee ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:52
Waarom zoek je door de dataset, en niet direct door de DB ?

Je kan ook de Find() method van de datatable gebruiiken.

https://fgheysels.github.io/


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
offtopic:
Ik weet niet precies waarom je aan het zoeken bent, maar als dit is om gebruikersinformatie op te halen voor één gebruiker, dan is zo'n dataset approach wel een beetje overkill. Hij maakt nu namelijk een kopie van die hele tabel (tenzij je daar in je select query rekening mee hebt gehouden).

Zoveel users zul je denk ik niet hebben, maar bedenk dat in andere situaties dit best veel records kunnen worden. In zo'n geval kan je beter een daar op toegespitste sql query gebruiken.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • MikevanEngelen
  • Registratie: Mei 2001
  • Laatst online: 22-05 14:39
Infinitive schreef op 08 september 2004 @ 11:54:
offtopic:
Ik weet niet precies waarom je aan het zoeken bent, maar als dit is om gebruikersinformatie op te halen voor één gebruiker, dan is zo'n dataset approach wel een beetje overkill. Hij maakt nu namelijk een kopie van die hele tabel (tenzij je daar in je select query rekening mee hebt gehouden).

Zoveel users zul je denk ik niet hebben, maar bedenk dat in andere situaties dit best veel records kunnen worden. In zo'n geval kan je beter een daar op toegespitste sql query gebruiken.
Ik heb inderdaad niet zoveel users, gaat om een stuk of 10. Echter het probleem is waar ik tegen aanliep dat het select statement dus ook niet deed wat ik wilde.
Ik deed de volgende select statement:

ByteFX.Data.MySqlClient.MySqlCommand("Select * from tbl_siteusers order by personeelsnummer where gebruikersnaam =" & dbvar_login & "", dbconnectie1)

Edit: het probleem hierbij was, dat hij em nooit afcatchde, maar ALTIJD door ging :S ook al bestond die gebruikersnaam niet in de db.

[ Voor 12% gewijzigd door MikevanEngelen op 08-09-2004 12:03 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 01:20

TeeDee

CQB 241

MikevanEngelen schreef op 08 september 2004 @ 12:02:
[...]


Ik heb inderdaad niet zoveel users, gaat om een stuk of 10. Echter het probleem is waar ik tegen aanliep dat het select statement dus ook niet deed wat ik wilde.
Ik deed de volgende select statement:

ByteFX.Data.MySqlClient.MySqlCommand("Select * from tbl_siteusers order by personeelsnummer where gebruikersnaam =" & dbvar_login & "", dbconnectie1)
edit: nevermind...

pseudo code
C#:
1
2
3
4
5
6
try {
while (dataset.Read())
catch 
vang je eof op
end
}

[ Voor 22% gewijzigd door TeeDee op 08-09-2004 12:06 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • MikevanEngelen
  • Registratie: Mei 2001
  • Laatst online: 22-05 14:39
whoami schreef op 08 september 2004 @ 11:51:
Waarom zoek je door de dataset, en niet direct door de DB ?

Je kan ook de Find() method van de datatable gebruiiken.
Geen id eigelijk ;) Ik heb altijd geleerd op school dat je een dataset aanmaakt (die naar de client gehaalt wordt) dat je daar je wijzingen aanbrengt, en dat je dan later als je klaar bent de dataset terug schrijft naar de database.

Zo is 't mij geleerd :) Maja, dat zegt ook niet zoveel...

  • MikevanEngelen
  • Registratie: Mei 2001
  • Laatst online: 22-05 14:39
TeeDee schreef op 08 september 2004 @ 12:04:
[...]

Define: deed niet wat ik wilde.
- Gaf ie een error melding?
- Is bovenstaande de exacte code, zo ja, is gebruikersnaam een string? Zo ja, dan mis je imho een quote [ ' ] in je statement.
Juist niet :) Hij liep dus gewoon door.
"where gebruikersnaam" dat is een kolom in de tabel (de kolom gebruikersnaam), daar wil ik de vergelijking uithalen welke in "dbvar_login" staat (wat overigens wel een string is).
ik heb het trouwens ook geprobeerd met:

System.Data.MySqlClient.MySqlCommand("Select * from tbl_siteusers order by personeelsnummer where gebruikersnaam = " & "'" & dbvar_login & "'" & "", dbconnectie1)
Bij die code loopt ie door, bij de vorige geeft hij gewoon een error (hij geeft false terug).

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:52
Een ORDER BY moet je laatste statement zijn in je SQL statement. Je moet dus eerst je WHERE zetten, dan pas je ORDER BY.
Vandaar dat hij een fout gaf.

https://fgheysels.github.io/


  • MikevanEngelen
  • Registratie: Mei 2001
  • Laatst online: 22-05 14:39
Heb de code overnieuw geschreven, en nog steeds stapt hij door naar de catch.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Function dbVullen() As Boolean
        Try
            dbOpenen()
            dbda.SelectCommand = New ByteFX.Data.MySqlClient.MySqlCommand("Select * from tbl_siteusers order by personeelsnummer", dbcon)
            dbda.Fill(dbdt)
            dbSluiten()
            Return True
        Catch
            Return False
        End Try
    End Function

>>>

    Function dbZoeken() As Boolean
        Try
            dbdt.Rows.Find(frmMain.lsgntmp)
            Return True
        Catch
            Return False
        End Try
    End Function


Bij de onderste functie schiet hij direct over naar de catch (nadat hij het probeerd te vinden). Kan hij uberhaupt wel met strings zoeken ? (die string bevat de tekst "jan" of "piet")

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:52
In plaats van je exceptie op te eten: bekijk de message eens, en zie waar hij over valt.
Kijk ook eens wat je aan Find moet meegeven als parameter, en wat jij meegeeft.

Wat is die frmMain.lnsblaat_onduidelijke_variablenaam trouwens?

Find moet zo'n argument meekrijgen:

Find ("columnname=arg");

[ Voor 63% gewijzigd door whoami op 08-09-2004 12:45 ]

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Als je nou eens begint met:
code:
1
2
3
4
5
6
7
8
9
Function dbZoeken() As Boolean
    Try
        dbdt.Rows.Find(frmMain.lsgntmp)
        Return True
    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)
        Return False
    End Try
End Function

Dan krijg je in ieder geval de exception en weet je wat er mis is. Jij negeert de exception en gaat dan vragen waarom hij die geeft. Het antwoord ligt in 100% van de gevallen in de exception opgeslagen, dus KIJK wat die is.

Daarna kun je met de foutmelding verder zoeken. 1 van de hints die ik je kan geven: de Find() die jij gebruikt (DataRowsCollection.Find()) zoekt in de primary key van de datatable. Als je geen PK info in die table laadt, dan krijg je een MissingPrimaryKeyException, zie Find() in de documentatie.

Je kunt de row vinden op 2 manieren:
1) je loopt door de rows. Dit is het snelst.
2) je maakt een dataview van de datatable en filtert op de row die je zoekt.

[ Voor 3% gewijzigd door EfBe op 08-09-2004 12:50 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 08 september 2004 @ 12:43:
In plaats van je exceptie op te eten: bekijk de message eens, en zie waar hij over valt.
Kijk ook eens wat je aan Find moet meegeven als parameter, en wat jij meegeeft.

Wat is die frmMain.lnsblaat_onduidelijke_variablenaam trouwens?

Find moet zo'n argument meekrijgen:

Find ("columnname=arg");
Welke Find is dat dan, want DataTable heeft bij mij geen Find() :? (of ik kijk niet goed)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:52
Hmm, excuse me.
Ik had het op Select
* whoami verwart deze 2 meestal, en ik had het ook niet nagekeken. :+

https://fgheysels.github.io/


  • MikevanEngelen
  • Registratie: Mei 2001
  • Laatst online: 22-05 14:39
EfBe schreef op 08 september 2004 @ 12:49:
Als je nou eens begint met:
code:
1
2
3
4
5
6
7
8
9
Function dbZoeken() As Boolean
    Try
        dbdt.Rows.Find(frmMain.lsgntmp)
        Return True
    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)
        Return False
    End Try
End Function

Dan krijg je in ieder geval de exception en weet je wat er mis is. Jij negeert de exception en gaat dan vragen waarom hij die geeft. Het antwoord ligt in 100% van de gevallen in de exception opgeslagen, dus KIJK wat die is.

Daarna kun je met de foutmelding verder zoeken. 1 van de hints die ik je kan geven: de Find() die jij gebruikt (DataRowsCollection.Find()) zoekt in de primary key van de datatable. Als je geen PK info in die table laadt, dan krijg je een MissingPrimaryKeyException, zie Find() in de documentatie.

Je kunt de row vinden op 2 manieren:
1) je loopt door de rows. Dit is het snelst.
2) je maakt een dataview van de datatable en filtert op de row die je zoekt.
Ik zoek eigelijk alleen maar de info die in een bepaalde row staat.
Het nummer van deze row (personeelsnummer) heb ik nodig voor vervolg opties. Als "aanwijzer" in de tabel.

Hij geeft trouwens idd de melding
A first chance exception of type 'System.Data.MissingPrimaryKeyException' occurred in System.Data.dll
Table doesn't have a primary key.

Nu nog opzoeken hoe ik die PK er bij kan zetten (wat ik trouwens weird vind wat in de tabel zelf is persooneelsnummer ook al PK + autonummering. Of hebben deze 2 totaal niets met mekaar te maken ?
Toch vind ik het wel raar, want in het verleden heb ik dit nooit hoeven doen. De code heb ik van een vs.net 2003 applicatie af gekopieerd waar het wel werkte. Nu bij vs.net 2005(beta) werkt het niet meer.
Pagina: 1