[C#] Een database doorzoeken

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik moet voor school een kleine applicatie maken waarin we de basics leren van het doorzoeken van een database en dergelijke. Ik kom er helaas even niet wijs uit.

Ik zal even in grote lijnen uitleggen wat het idee is. Zogenaamd is dit een database van Hyves. Daaruit moeten we van een combobox iemand kunnen selecteren, en vervolgens door een druk op de knop kunnen bepalen hoeveel mensen er in zijn of haar stad wonen (die geregistreerd zijn bij de database uiteraard), en wat de gemiddelde leeftijd is.

Mij leek dus dat je dan de tekst uit die combobox pikt, daarmee de user uit de database opzoekt, vervolgens de bijbehorende stad kopieert, weer opzoekt hoe vaak die stad voor komt en tegelijkertijd van iedereen de leeftijden optelt waarna je die op het einde deelt door het aantal gevonden personen.

Het stukje met de gemiddelde leeftijd heb ik nog even weggelaten. Dat is het grootste probleem natuurlijk niet. Het is mij echter op dit moment totaal niet duidelijk hoe ik een database moet doorzoeken. Ik heb iets als dit geprobeerd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            string woonplaatstemp = null;
            int aantal = 0;

            //de naam uit 'van' opzoeken, en daarvan de woonplaats kopieren.
            foreach (HyvesDataSet.ProfielRow profiel in hyvesDataSet.Profiel)
            {
                if (hyvesDataSet.Profiel.KorteNaamColumn.ToString() == vanComboBox.Text)
                {
                    woonplaatstemp = hyvesDataSet.Profiel.WoonplaatsColumn.ToString();
                }
            }

            //controleren hoe vaak de woonplaats voor komt, en aantal ophogen wanneer gevonden.
            foreach (HyvesDataSet.ProfielRow profiel in hyvesDataSet.Profiel)
            {
                if (woonplaatstemp == hyvesDataSet.Profiel.WoonplaatsColumn.ToString())
                {
                    aantal++;
                }
            }

            labelWoonplaatsInvul.Text = woonplaatstemp;
            tbProfielen.Text = Convert.ToString(aantal);


Dit werkt echter niet. Ik weet alleen niet waarom. Ik heb het vage idee dat ik er compleet naast zit en dat je zo een database helemaal niet op deze manier kunt doorzoeken.. maar hoe dan wel?

Acties:
  • 0 Henk 'm!

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 17:55
Hint... schrijf een stored procedure die je de naam van de persoon opgeeft en daarmee de benodigde gegevens teruggeeft. Op die manier hoef je maar een enkel request naar de database te doen :)

Let wel op dat je nog enige controle op de input van de gebruikersinput doet :) (voor school minder relevant, maar leer het je goed aan)

[ Voor 26% gewijzigd door asfaloth_arwen op 05-06-2009 14:58 ]

Specs


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor je reply. Ik ga het even nakijken. De controle op de input moeten we inderdaad ook doen :) (je bedoelt met catch en try neem ik aan?).

Wat misschien wel belangrijk is, ik ben vergeten te melden dat het om een access database gaat.

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Verwijderd schreef op vrijdag 05 juni 2009 @ 15:08:
Bedankt voor je reply. Ik ga het even nakijken. De controle op de input moeten we inderdaad ook doen :) (je bedoelt met catch en try neem ik aan?).

Wat misschien wel belangrijk is, ik ben vergeten te melden dat het om een access database gaat.
Wowow hij bedoelt niet catch try (ook belangrijk) maar escaping van de input:

stel je hebt de query "select * from personen where name = [naam]"

Als je dan voor naam de directe invoer gebruikt van een textbox dan zou ik daar "jacob; drop table personen" in kunnen zetten waardoor ik je database leeg heb gemaakt.

Verder zoek je nu niet zozeer echt in een database maar zoek je lokaal door je data, bijvoorbeeld je kunt vinden hoeveel mensen er wonen in een stad door "select count(*) from personenen where woonplaats=[woonplaats]" nu doe je dit manueel (langzamer) en zorg je er ook nog is voor dat je eerst alle data uit de database moet halen.

(select count(*) is geloof ik mysql syntax maar access zal ook zoiets hebben)

[ Voor 5% gewijzigd door roy-t op 05-06-2009 15:14 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 18:53

remco_k

een cassettebandje was genoeg

Ik heb het vage idee dat ik er compleet naast zit en dat je zo een database helemaal niet op deze manier kunt doorzoeken..
Op deze manier database records "opzoeken" is niet de bedoeling, want zo doe je juist teniet waar een database zo onwijs sterk in is (en ongeveer de grootste reden waarom databases bestaan): de vraag rechtstreeks aan de database stellen:

code:
1
SELECT * FROM tabel WHERE voorwaarde


Dus de woonplaats opzoeken van een gebruiker:
code:
1
SELECT woonplaats FROM gebruikers WHERE naam='pipo de clown'


De rest van je opdracht kan je ook met queries en een simpel sommetje voldoen.

[ Voor 54% gewijzigd door remco_k op 05-06-2009 15:26 ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Als we dan toch bezig zijn, gebruik dan nooit "SELECT *" maar altijd "SELECT veld1, veld2, veld3, etc."

En als de TS geen echte database kan gebruiken, maar de alleen DataSet moet gebruiken (b.v. omdat de data middels een XML file in geheugen geladen wordt en er geen echte DB is), dan kun je de SQL statements "simuleren" middels: hyvesDataSet.Profiel.Select(...)

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
SKiLLa schreef op vrijdag 05 juni 2009 @ 15:19:
Als we dan toch bezig zijn, gebruik dan nooit "SELECT *" maar altijd "SELECT veld1, veld2, veld3, etc."

En als de TS geen echte database kan gebruiken, maar de alleen DataSet moet gebruiken (b.v. omdat de data middels een XML file in geheugen geladen wordt en er geen echte DB is), dan kun je de SQL statements "simuleren" middels: hyvesDataSet.Profiel.Select(...)
"Wat misschien wel belangrijk is, ik ben vergeten te melden dat het om een access database gaat."

Ik had er eerst ook overheen gelezen.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is nog een beetje abracadabra voor mij, ze laten ons veel aanklooien dus we moeten vrijwel alles zelf uitzoeken :P Maar dat is niet erg, het verklaar alleen mijn noobism ;)
Bedankt voor de tips en hulp, ik denk dat ik hier wel genoeg mee kan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Euh.. nog steeds niet duidelijk dus. Te vroeg gejuicht.
Ik probeer bij de knop die het opzoeken moet starten iets in te voeren in de trant van:

SELECT woonplaats FROM gebruikers WHERE username='pipo de clown'

Maar dat 'from' en 'where' ziet hij als 'fout'. Zet ik het op de verkeerde plek neer?

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 18:53

remco_k

een cassettebandje was genoeg

Verwijderd schreef op vrijdag 05 juni 2009 @ 15:28:
Euh.. nog steeds niet duidelijk dus. Te vroeg gejuicht.
Ik probeer bij de knop die het opzoeken moet starten iets in te voeren in de trant van:

SELECT woonplaats FROM gebruikers WHERE username='pipo de clown'

Maar dat 'from' en 'where' ziet hij als 'fout'. Zet ik het op de verkeerde plek neer?
Ik ken Access niet (en wil het ook niet kennen), maar je zit blijkbaar in het scripting / VB code gedeelte ofzo. Ow wacht, het is C#. Naja, daar ben ik ook niet echt in thuis...
Je moet een plek hebben waar je een SQL statement in kan vullen. Kan wellicht met een database connection en query object... ofzoiets.

Kijk ook nog even naar dit antwoord:
SKiLLa schreef op vrijdag 05 juni 2009 @ 15:19:
...
En als de TS geen echte database kan gebruiken, maar de alleen DataSet moet gebruiken (b.v. omdat de data middels een XML file in geheugen geladen wordt en er geen echte DB is), dan kun je de SQL statements "simuleren" middels: hyvesDataSet.Profiel.Select(...)
Misschien dat je daarmee ook hetzelfde kan.


Edit:
En vanzelfsprekend moet je de opgevraagde kolommen en tabellen even vertalen naar hoe ze in jouw database heten.

[ Voor 37% gewijzigd door remco_k op 05-06-2009 15:35 ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja ik snap dat ik de kolommen en tabellen moet vertalen :P ( vandaar ook 'in de trant van' ;) )
Maar het is me even onduidelijk waar ik deze code nou moet plaatsen...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zie nu je edit. Het was me al niet duidelijk wat er precies bedoeld werd. Ik moet dit dus zien als 'niet een echte database' ? Waarom precies?

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 18:53

remco_k

een cassettebandje was genoeg

Dat ik access databases geen echte databases vind is mijn mening, geen regel. :) (schreef ik ook nergens toch? )
Je kan ze wel benaderen als echte databases, dus gewoon met "SELECT bla FROM bliep WHERE blap".

Ik denk dat je even ergens een tutorial moet opsnorren hoe je met C# een access database opend, een SQL statement (query) af kan schieten en de resultset kan lezen.

Edit:
Je hebt geluk; ik ben in een goede bui en heb die tutorial effe voor je opgezocht:
http://www.easysoft.com/d.../csharp/ado-net-odbc.html

That should get jou started.

[ Voor 25% gewijzigd door remco_k op 05-06-2009 15:41 ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Even een tip: ga eerst eens proberen in access met SQL de juiste info tevoorschijn te toveren, en daarna dit vanuit C# te doen. Access ondersteund gewoon SQL (wel een redelijk beperkte subset maar toch) en je kunt gewoon in access een nieuwe query maken en dan naar SQL view gaan. Daar kun je naar hartelust experimenteren.

https://niels.nu

Pagina: 1