[vb.net] return statement

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo

Ik ben een laatstejaars student boekhouden-informatica en ik ben momenteel bezig een programma te ontwikkelen voor mijn gip. Ik zit echter vast. Ik heb op verschillende forums gezocht maar heb geen oplossing voor mijn probleem gevonden. Ik hoop dat hier iemand mij kan helpen..

De bedoeling is om vanuit een databank de voor de gebruiker mogelijke variabele input in een combobox weer te geven. Ik zou dit willen doen met een functie. Het uitlezen van mijn databank gebeurt via een 'Do.. While'. Ik wil mijn gegevens via een return statement weergeven maar hiervoor zou ik het hele 'Do While' statement moeten kunnen gebruiken anders wordt enkel het eerste gegeven weergegeven...

Dit is mijn code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Imports System.Data.OleDb
Public Class Details

    Public Function Insert(ByVal SelectStatement As String, ByVal ToeTeVoegenGegeven As String)
        Dim Datareader As OleDbDataReader
        command.Connection = connection
        connection.ConnectionString = My.Settings.csAED
        command.CommandText = SelectStatement
        connection.Open()
        Datareader = command.ExecuteReader
        Do While Datareader.Read()
            Datareader.Item(ToeTeVoegenGegeven).ToString()
        Loop


    End Function

    Dim connection As New OleDbConnection
    Dim command As New OleDbCommand
    Private Sub Details_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'voorbereiding om met databank te werken
        connection.ConnectionString = My.Settings.csAED
        command.Connection = connection

    End Sub

    Private Sub Add_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Add.Click

        'variabele aanmaken om te weten of alle opties al een keer ingelezen zijn
        Static Dim ingelezen As String
        If ingelezen <> "ok" Then



            Application.Items.Add(Insert("SELECT Name FROM tblApplication", "name"))

Ik hoop dat iemand me met mijn probleem kan helpen!
alvast bedankt!

[ Voor 1% gewijzigd door RobIII op 03-04-2014 21:02 . Reden: code-tags opgeschoond ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
2
3
4
5
mylist = new list()
do while
  mylist.add(item)
loop
return mylist

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
In plaats van return,
code:
1
Yield item

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
ow en je disposed momenteel niet je
- connection
- command
- datareader

je reader moet je disposen als je uitgelezen bent, en die andere twee defineer je in je class. Dit betekend dat je je class de IDisposable interface moet meegeven.

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Doorgeven als generic list?

code:
1
2
3
4
5
6
7
8
9
Public Function GetApplications() As List(Of String)

Dim result As New List(Of String)

result.add( doe hier je datareader.tostring )

Return result

End Function


En in de code voor de combobox:

code:
1
2
3
For Each item As String In GetApplications()
  cbo.Items.Add(item)
Next


Ik zou het select statement en de naam van de kolom (name) gewoon in de GetApplications functie zetten. User interface code moet daar niks mee doen en gewoon een lijst met applicaties opvragen (of wat er dan ook in tblApplication staat).

Separation of concerns :P

Dus het liefste staat de GetApplications() functie ook in een aparte class (domein class).

Meestal heb je een scheiding tussen user interface, domein en data classes. In jouw code is dat helemaal zoek. Ik moest hem echt 3 keer lezen voordat ik doorhad wat het doet :P En ik werk al ruim 10 jaar als ontwikkelaar.

[ Voor 50% gewijzigd door Lethalis op 04-04-2014 16:29 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 20:37
BasieP schreef op vrijdag 04 april 2014 @ 15:49:
[...] Dit betekend dat je je class de IDisposable interface moet meegeven.
Of je zorgt ervoor dat je de resources zelf disposed in de destructor.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

MSalters schreef op vrijdag 04 april 2014 @ 15:26:
In plaats van return,
code:
1
Yield item
Nonsense. Yield return is niet hetzelfde als een list returnen.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Caelorum schreef op vrijdag 04 april 2014 @ 16:28:
[...]

Of je zorgt ervoor dat je de resources zelf disposed in de destructor.
De destructor is niet deterministisch, het is best-practise om elke class die IDisposable members heeft zelf ook IDisposable te laten implementeren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 19-09 11:23

Acid_Burn

uhuh

BasieP schreef op vrijdag 04 april 2014 @ 15:49:
ow en je disposed momenteel niet je
- connection
- command
- datareader

je reader moet je disposen als je uitgelezen bent, en die andere twee defineer je in je class. Dit betekend dat je je class de IDisposable interface moet meegeven.
Die worden automatisch gedisposed zodra ze buiten de scope zijn. Alleen zijn datareader moet hij nog sluiten (.close)

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 19:45
MSalters schreef op vrijdag 04 april 2014 @ 15:26:
In plaats van return,
code:
1
Yield item
Werkt pas in VS2012+.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Acid_Burn schreef op vrijdag 04 april 2014 @ 16:34:
[...]

Die worden automatisch gedisposed zodra ze buiten de scope zijn.
En wanneer zijn class members dan buiten scope? En sowieso, sinds wanneer doet .Net iets met deterministic finalization op basis van scope (afgezien van using)?

[ Voor 21% gewijzigd door .oisyn op 04-04-2014 17:56 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 19-09 11:23

Acid_Burn

uhuh

Ik dacht te hebben gezien dat connection en command ook binnen een functie zaten. Daar zat ik mis.

Als de instance van deze class vervalt worden deze voor zover ik weet trouwens ook gewoon opgeruimd, dat hoef je zelf niet te doen. In alle voorbeelden van MS zelf wordt ook nooit de dispose aangeroepen.

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Acid_Burn schreef op vrijdag 04 april 2014 @ 19:53:
Als de instance van deze class vervalt worden deze voor zover ik weet trouwens ook gewoon opgeruimd, dat hoef je zelf niet te doen. In alle voorbeelden van MS zelf wordt ook nooit de dispose aangeroepen.
Ooit een keer door de garbage collection ja, maar je weet niet wanneer dat is. Verder klopt het ook niet dat MS in zijn examples nooit Disposed.

MSDN: SqlConnection Class (System.Data.SqlClient)
To ensure that connections are always closed, open the connection inside of a using block, as shown in the following code fragment. Doing so ensures that the connection is automatically closed when the code exits the block.
Voor wat betreft het command & datareader zie ik in examples inderdaad vaak dat deze niet netjes in een using gebruikt worden, eigenlijk gek, maar waarschijnlijk worden de resources daarvan al vrijgegeven op het moment dat de connection vrij gegeven wordt, en dus is het minder belangrijk.

Maar zeker in het geval van een connection i.c.m. connection pooling kan het vervelende gevolgen hebben als je de connection niet goed Closed/Disposed.

Al met al is de vuistregel: Als je een IDisposable hebt gebruik je die in een using block, of als je members hebt die IDisposable implementeren, implementeer je zelf ook IDisposable.

[ Voor 6% gewijzigd door Woy op 04-04-2014 20:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 19-09 11:23

Acid_Burn

uhuh

Connections close ik altijd wel in ieder geval... :)

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zet het even in C#, maar dit komt uiteindelijk op hetzelfde neer, alleen is de syntax een beetje anders.

Ik weet niet wat je uit je databank wil halen, maar in je codesnippet zie ik dat er in de Insert-method een string wordt meegegeven, dus ga ik er even van uit dat je strings wil ophalen.

Visual Basic:
1
2
3
4
5
6
7
8
Public Function Ophalen() As IEnumerable(Of String)
    Dim returnValue As ICollection(Of String) = New Collection(Of String)()
    ' logica om met databank te connecteren en data op te halen komt hier ongeveer
    While datareader.Read()
        returnValue.Add(reader(0)) ' het correct ophalen van de juiste kolom uit de datarecord moet je hier nog even bekijken
    End While
    Return returnValue
End Function
Pagina: 1