[VB .NET] Database & Classes

Pagina: 1
Acties:

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Ik heb een aantal probleempjes met betrekking tot mijn applicatie + database. De database zelf is goed uitgenormaliseerd, geen problemen mee.

Probleem nr. 1
Ik heb in de database een tabel tbl_Templates met de volgende 2 velden:
ID_Template -> Primairy key (autonumber), heeft uiteraard een 1 op veel relatie met een andere tabel.
strNaam -> Naam van de template |:(

Indien het knopje voor een nieuw template ingedrukt wordt gebeurt ongeveer het volgende: een InputBox vraagt voor een naam, controleer eerst in de database of deze al bestaat, zoniet, invoeren. Nu komt het probleem :) Ik wil nu de ID_Template hebben. Ik krijg hem ook wel, alleen het duurt even. Ik doe dit nu met het volgende stukje code:
code:
1
2
3
4
        strSQL = "SELECT ID_Template FROM tbl_Templates WHERE strNaam = '" & strResult & "'"
        Do While ID_Template = 0
            ID_Template = m_objDatabase.GetValue(strSQL)
        Loop

Iets meer uitleg van CDatabase komt verder onderin de post, maar GetValue lijkt me voor zich spreken :) ExecuteScalar dus.

Als ik nu een teller laat meelopen in de Do While Loop, staat die aan het eind op rond de 1000 :). Het duurt ook een paar seconde voordat ie de ID_Template heeft. Waarschijnlijk ook omdat ie een paarhonderd keer per seconde een query uitvoer. Als ik break op Do While, dus de INSERT van het template naam is net uitgevoerd, moet ik ook ong. 2 seconde wachten voordat ik naar de volgende stap ga (getvalue..). Niet heel boeiend zou je denken, het queryen vertraagt het nu niet veel, maar dit bestand komt zometeen op het netwerk op een share te staan, en dan maakt het (lijkt me) wel veel uit kwa tijd.

Wat ik zelf als oplossing had bedacht is een Timer control met een delay van een halve seconde en bij de timer_Tick die ID_Template opvragen, maar het is me niet gelukt om de timer aan de praat te krijgen. Ik doe vast iets fout maar ik weet niet wat.

Nu zijn mijn vragen mbt tot dit probleem, hoe doe ik dat met die timer en is er misschien een andere manier om de ID op te vragen met ODBC? Uiteraard gaan we niet met Max(id)+1 werken.

Oke, volgende problemen komen in een andere post, tis 4:24, weltruste :)


ohja hier nog een stukje:

CDatabase -> Regelt alles mbt het mdb bestand
Deze klasse bevat een CONST connectionstring en een OdbcConnection.
Hier een aantal functies uit de klasse:
code:
1
2
3
4
5
6
7
8
    Public Sub New()
    Public Function Execute(ByVal strSQL As String) As Integer
    Public Function OpenRecordset(ByVal strSQL As String) As OdbcDataReader
    Public Function GetValue(ByVal strSQL As String) As Object
    Public ReadOnly Property IsConnected() As Boolean
    Public Sub Disconnect()
    Public Sub Reconnect()
    Public Sub RefreshDatabase()


Hoe ik met tabellen werk:
Voor bijv. de Templates heb ik de volgende 2 klasses:
CTemplates en CTemplate

Een CTemplate bevat uiteraard een 2tal variabelen en properties om de variabellen te setten en getten :) Ook een public sub new(byval id_Template as long). Deze sub leest uiteraard de template naam in op basis van die ID_Template dmv van een query.

CTemplates bevat een Collection van CTemplate's en aantal property's om wat met de Collection te kunnen.

Wil ik nu door mijn Templates heen lopen doe ik dat zo:
code:
1
2
3
4
5
6
7
8
9
Dim Templates As New CTemplates
Dim Template As CTemplate

For Each Template in CTemplates.Templates ' waarbij de property .Templates 
                                          ' uiteraard de Collection van CTemplates Returnt.
       With Template

       End With
Next

Wat een onzin..


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 15:50

gorgi_19

Kruimeltjes zijn weer op :9

Gekke vraag, maar waarom oet je een paar 100 keer een query uitvoeren? Heb je zo veel Inserts, die je moet doen?
Of zit je in de for-each loop iedere keer die select query uit te voeren?

[ Voor 26% gewijzigd door gorgi_19 op 24-07-2004 09:53 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
1) Waarom zet je niet een unique constraint op het veld strNaam, en probeer je een insert te doen. Je moet alleen netjes de fout afhandelen als de naam al bestaat.

2) Voor het opvragen van je ID zijn afhankelijk van je database verschillende mogelijkheden. Welke db gebruik je?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
gorgi_19:
Nee, er is 1 INSERT, namelijk het nieuwe template. Ik wil het liefst ook maar een paar keer die SELECT loop door, daar had ik die timer voor bedacht, alleen krijg ik die niet aan de praat.

P_de_B:
1. Is ook een mogelijkheid ipv controleren in de DB of ie bestaat, dit had ik ff snel gedaan. Maak er wel een unique constraint van.

2. Ik gebruik een .mdb file gemaakt in Access 2000. En gebruik dus een ODBCConnection en DataReaders etc.

Wat een onzin..


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Dit artikel geeft je genoeg info denk ik. Het eerste stuk gaat over SQL Server, maar even verderop gaat het ook over Acess.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Bedankt, ik ga lezen :)
Gek dat ik dit niet eerder had gevonden btw.. kben ook google freak

[ Voor 60% gewijzigd door dixon op 24-07-2004 17:28 ]

Wat een onzin..


  • dixon
  • Registratie: Januari 2001
  • Laatst online: 01-01 21:15
Ik zie het alweer, dit is precies wat ik moet hebben, thnx

iets te snel gejuigd. Dit is met een OleDb adapter. Zal ik dan maar moeten aanpassen :) np

[ Voor 45% gewijzigd door dixon op 24-07-2004 17:38 ]

Wat een onzin..


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
dixon schreef op 24 juli 2004 @ 17:31:
Ik zie het alweer, dit is precies wat ik moet hebben, thnx

iets te snel gejuigd. Dit is met een OleDb adapter. Zal ik dan maar moeten aanpassen :) np
OleDB is in principe ook een betere keuze dan ODBC :)

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1