Connection en datareader vraag stuk

Status
Niet open voor verdere reacties.

harolda1980

Gebruiker
Lid geworden
7 aug 2007
Berichten
488
Ik heb een programma waarin ik in het begin de Connection open met mijn mysql database. Nu ga ik elke keer een datareader aanmaken per code om informatie te verwerken. Nu komt er de melding dat de Connection een niet gebruikt kan worden omdat er nog een datareader actief is.

Terwijl ik elke datareader na gebruik sluit. Hoe kan ik dit probleem verhelpen?
 
je kan natuurlijk elke datareader een andere naam geven en zo eindeloos door blijven openen. Het feit dat je deze melding krijgt betekend dat je variabelen hergebruikt(wat denk ik een goed teken is) het houd je namelijk scherp en voorkomt dat je zinloos datareaders open laat staan.
Toch nog een keer je code dus doorlopen of je niet ergens een close bent vergeten.

Wat bij mij nog wel een voorkomt is dat ik in een active foreach loop zit op een geopende datareader en wat info moet bijzoeken. Dan ontkom ik er natuurlijk niet aan om een extra datareader te openen want ik wil de eerste helemaal niet sluiten. Door de 2e datareader in de foreach op te nemen weet ik dat zo snel de foreach over is hij automatisch mijn 2e datareader zal sluiten (garbage collector).

Als het niet een van deze 2 problemen is dan moet je even wat code neerzetten zodat we inhoudelijk kunnen kijken
 
Ik zit even in twijfel want de code die draait zit in een hele pagina.

In deze code komt de fout naar voren:

Private Sub CmdUitvoeren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdUitvoeren.Click
Daarin gaat DR_uitvoeren in de fout. Bij het

Code:
Imports MySql.Data
Imports MySql.Data.MySqlClient
Imports Microsoft.Office.Interop

Public Class FMInstatAfnameMenu
    Dim dbcon As MySqlConnection
    Dim strQeury As String = ""
    Dim SQLCmd As MySqlCommand
    Dim DR As MySqlDataReader
    Dim INSTAT_AantalWeken As Long

    Private Sub GetDBdata()
        Try
            'Prepare connection and Query
            dbcon = New MySqlConnection("server=10.1.30.104;Database=vm06inkdb1;UID=VBvm;Password=vermaat")
            strQeury = "SELECT tblfab.F_naam, tblfab.F_blok FROM tblfab WHERE tblfab.F_blok = 0"
            SQLCmd = New MySqlCommand(strQeury, dbcon)
            'open the db and kickoff
            dbcon.Open()
            DR = SQLCmd.ExecuteReader
            While DR.Read
                CbFabrikant.Items.Add(DR.Item("F_naam"))
            End While
            CbFabrikant.Sorted = True
            DR.Close()
            strQeury = "SELECT tblafname.AF_jaar FROM tblafname GROUP BY tblafname.AF_jaar"
            SQLCmd = New MySqlCommand(strQeury, dbcon)
            'open the db and kickoff
            DR = SQLCmd.ExecuteReader
            While DR.Read
                CbJaartal.Items.Add(DR.Item("AF_jaar"))
            End While
            CbJaartal.Sorted = True
            DR.Close()

        Catch ex As Exception
            MsgBox("Foutmelding met communicatie" & vbCrLf & vbCrLf & ex.Message)
        End Try
    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub

    Private Sub FMInstatAfnameMenu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TS1.Text = Environment.UserName & " " & Now
        GetDBdata()
        CmdUitvoeren.Enabled = False
        CbWeekeinde.Enabled = False
        CbWeekStart.Enabled = False
        CbMerk.Enabled = False
        CbJaartal.Enabled = False
        RbAfname1.Enabled = False
        RbAfname2.Enabled = False
    End Sub

    Private Sub CbFabrikant_SelectedIndexChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CbFabrikant.SelectedIndexChanged
        If CbFabrikant.Text <> "" Then
            CbMerk.Items.Clear()
            strQeury = "SELECT tblfab.F_naam, tblmerk.M_naam FROM tblmerk INNER JOIN tblfab ON tblmerk.fid = tblfab.fid WHERE tblfab.F_naam = '" & CbFabrikant.Text & "'"
            SQLCmd = New MySqlCommand(strQeury, dbcon)
            DR = SQLCmd.ExecuteReader
            While DR.Read
                CbMerk.Items.Add(DR.Item("M_naam"))
            End While
            CbMerk.Sorted = True
            CbMerk.Enabled = True
            CbJaartal.Sorted = True
            DR.Close()
        End If
    End Sub

    Private Sub CbMerk_SelectedIndexChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CbMerk.SelectedIndexChanged
        If CbMerk.Text <> "" Then
            CbJaartal.Enabled = True
        End If
    End Sub

    Private Sub CbJaartal_SelectedIndexChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CbJaartal.SelectedIndexChanged
        If CbJaartal.Text <> "" Then
            strQeury = "SELECT tblafname.AF_jaar, tblafname.AF_week FROM tblafname WHERE tblafname.AF_jaar = " & CbJaartal.Text & " GROUP BY tblafname.AF_week"
            SQLCmd = New MySqlCommand(strQeury, dbcon)
            DR = SQLCmd.ExecuteReader
            CbWeekeinde.Items.Clear()
            CbWeekStart.Items.Clear()
            While DR.Read
                CbWeekeinde.Items.Add(DR.Item("AF_week"))
                CbWeekStart.Items.Add(DR.Item("AF_week"))
            End While
            CbWeekeinde.Enabled = True
            CbWeekStart.Enabled = True
            RbAfname1.Enabled = True
            RbAfname1.Checked = True
            DR.Close()
        End If
    End Sub

    Private Sub CmdUitvoeren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdUitvoeren.Click
        Dim TypeStatistiek As String
        Dim PeriodeStatistiek As String
        Dim AfzenderStatistiek As String
        Dim MFstatistiek As String
        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim iRow As Integer
        Dim iCol As Integer
        Dim Afnamebestandsnaam As String
        Dim Countstring As String

        Dim DR_uitvoeren As MySqlDataReader

        If CbFabrikant.Text <> "" And CbMerk.Text <> "" Then
            strQeury = "SELECT tblfab.F_naam, tblmerk.M_naam, tblart.A_nr, tblart.A_naam, tblart.A_vp1, tblart.A_vp2, tblafname.AF_week, tblafname.AF_jaar, sum(tblafname.AF_af) AS Afname FROM tblmerk INNER JOIN tblfab ON tblmerk.fid = tblfab.fid INNER JOIN tblart ON tblart.A_merk = tblmerk.mid INNER JOIN tblafname ON tblafname.AID = tblart.aid WHERE tblafname.AF_jaar = " & CbJaartal.Text & " AND tblafname.AF_week BETWEEN " & CbWeekStart.Text & " AND " & CbWeekeinde.Text & " AND tblfab.F_naam = '" & CbFabrikant.Text & "' AND tblmerk.M_naam = '" & CbMerk.Text & "' GROUP BY tblafname.AID, tblafname.AF_jaar"
            TypeStatistiek = "Afname statistiek Fabrikant & Merk"
            MFstatistiek = "Afname inhoud: " & CbFabrikant.Text & " - " & CbMerk.Text
            Afnamebestandsnaam = "Afname " & CbFabrikant.Text & " - " & CbMerk.Text & " - " & CbJaartal.Text & " Week " & CbWeekStart.Text & " tm " & CbWeekeinde.Text
            'Countstring = "SELECT count(tblart.aid) AS CountArt, tblmerk.M_naam, tblfab.F_naam FROM tblart INNER JOIN tblmerk ON tblart.A_merk = tblmerk.mid INNER JOIN tblfab ON tblmerk.fid = tblfab.fid WHERE tblfab.F_naam = '" & CbFabrikant.Text & "' AND tblmerk.M_naam = '" & CbMerk.Text & "' GROUP BY tblfab.F_naam"
            'TsProgress.Maximum = Getrecordnummers(Countstring) + 5

        ElseIf CbFabrikant.Text <> "" And CbMerk.Text = "" Then
            strQeury = "SELECT tblfab.F_naam, tblmerk.M_naam, tblart.A_nr, tblart.A_naam, tblart.A_vp1, tblart.A_vp2, tblafname.AF_week, tblafname.AF_jaar, sum(tblafname.AF_af) AS Afname FROM tblmerk INNER JOIN tblfab ON tblmerk.fid = tblfab.fid INNER JOIN tblart ON tblart.A_merk = tblmerk.mid INNER JOIN tblafname ON tblafname.AID = tblart.aid WHERE tblafname.AF_jaar = " & CbJaartal.Text & " AND tblafname.AF_week BETWEEN " & CbWeekStart.Text & " AND " & CbWeekeinde.Text & " AND tblfab.F_naam = '" & CbFabrikant.Text & "' GROUP BY tblafname.AID, tblafname.AF_jaar"
            TypeStatistiek = "Afname statistiek Fabrikant & Merk"
            MFstatistiek = "Afname inhoud: " & CbFabrikant.Text
            Afnamebestandsnaam = "Afname " & CbFabrikant.Text & " - " & CbJaartal.Text & " Week " & CbWeekStart.Text & " tm " & CbWeekeinde.Text
            'Countstring = "SELECT count(tblart.aid) AS CountArt, tblmerk.M_naam, tblfab.F_naam FROM tblart INNER JOIN tblmerk ON tblart.A_merk = tblmerk.mid INNER JOIN tblfab ON tblmerk.fid = tblfab.fid WHERE tblfab.F_naam = '" & CbFabrikant.Text & "' GROUP BY tblfab.F_naam"
            'TsProgress.Maximum = Getrecordnummers(Countstring) + 5
        End If

        PeriodeStatistiek = "Statistiek periode: " & CbJaartal.Text & " Week " & CbWeekStart.Text & " t/m " & CbWeekeinde.Text
        AfzenderStatistiek = "Vermaat Groep afdeling inkoop"
        TsProgress.Value = 1

        xlApp = New Excel.Application
        xlWorkBook = xlApp.Workbooks.Add
        xlWorkSheet = xlWorkBook.Worksheets(1)

        'Basis informatie statistiek

        TsProgress.Value = 2
        xlWorkSheet.Cells(8, 1) = "Artikelnr"
        xlWorkSheet.Cells(8, 2) = "Artikelnaam"
        xlWorkSheet.Cells(8, 3) = "Merk"
        xlWorkSheet.Cells(8, 4) = "Eenheid"
        xlWorkSheet.Cells(8, 5) = "Inhoud"
        xlWorkSheet.Cells(8, 6) = "Afname"
        iCol = 0
        If ChkbArtLaatstePrijs.Checked = True Then
            iCol = iCol + 1
            xlWorkSheet.Cells(8, 6 + iCol) = "Art LP"
        End If
        If ChkbArtLaatstePrijs.Checked = True Then
            iCol = iCol + 1
            xlWorkSheet.Cells(8, 6 + iCol) = "Gem Colli"
        End If
        If ChkbArtPrivateLabel.Checked = True Then
            iCol = iCol + 1
            xlWorkSheet.Cells(8, 6 + iCol) = "Art PL"
        End If
        If ChkbArtOmzet.Checked = True Then
            iCol = iCol + 1
            xlWorkSheet.Cells(8, 6 + iCol) = "Art Omzet"
        End If
        If ChkbGroep.Checked = True Then
            iCol = iCol + 1
            xlWorkSheet.Cells(8, 6 + iCol) = "Art Groep"
        End If

        Dim SQLCmd As MySqlCommand
        SQLCmd = New MySqlCommand(strQeury, dbcon)
        DR_uitvoeren = SQLCmd.ExecuteReader
        iRow = 9
        TsProgress.Value = 3
        While DR_uitvoeren.Read

            iRow = iRow + 1
            iCol = 0
            xlWorkSheet.Cells(iRow, 1) = DR_uitvoeren.Item("A_nr")
            xlWorkSheet.Cells(iRow, 2) = DR_uitvoeren.Item("A_naam")
            xlWorkSheet.Cells(iRow, 3) = DR_uitvoeren.Item("M_naam")
            xlWorkSheet.Cells(iRow, 4) = DR_uitvoeren.Item("A_vp1")
            xlWorkSheet.Cells(iRow, 5) = DR_uitvoeren.Item("A_vp2")
            xlWorkSheet.Cells(iRow, 6) = DR_uitvoeren.Item("Afname")
            'Speciale artikelfuncties
            If ChkbArtLaatstePrijs.Checked = True Then
                iCol = iCol + 1
                xlWorkSheet.Cells(iRow, 6 + iCol) = ArtikelModule_LaatstePrijs(DR_uitvoeren.Item("A_nr"))
            End If
            If ChkbArtgem.Checked = True Then
                iCol = iCol + 1
                xlWorkSheet.Cells(iRow, 6 + iCol) = ArtikelModule_GemColli(DR_uitvoeren.Item("Afname"))
            End If
            If ChkbArtPrivateLabel.Checked = True Then
                iCol = iCol + 1
                xlWorkSheet.Cells(iRow, 6 + iCol) = ArtikelModule_PrivateLabel(DR_uitvoeren.Item("A_nr"))
            End If
            If ChkbArtOmzet.Checked = True Then
                iCol = iCol + 1
                xlWorkSheet.Cells(iRow, 6 + iCol) = ArtikelModule_Omzet(DR_uitvoeren.Item("A_nr"))
            End If
            If ChkbGroep.Checked = True Then
                iCol = iCol + 1
                xlWorkSheet.Cells(iRow, 6 + iCol) = ArtikelModule_Groep(DR_uitvoeren.Item("A_nr"))
            End If
            TsProgress.Value = TsProgress.Value + 1
        End While
        TsProgress.Value = TsProgress.Value + 1
        DR_uitvoeren.Close()

        xlWorkSheet.Columns(1).AutoFit()
        xlWorkSheet.Columns(2).AutoFit()
        xlWorkSheet.Columns(3).AutoFit()
        xlWorkSheet.Columns(4).AutoFit()
        xlWorkSheet.Columns(5).AutoFit()
        xlWorkSheet.Columns(6).AutoFit()

        xlWorkSheet.Cells(1, 1) = TypeStatistiek
        xlWorkSheet.Cells(2, 1) = MFstatistiek
        xlWorkSheet.Cells(3, 1) = PeriodeStatistiek
        xlWorkSheet.Cells(4, 1) = AfzenderStatistiek
        TsProgress.Value = TsProgress.Value + 1
        xlWorkBook.SaveAs(Filename:="C:\Users\hcontent\Documents\" & Afnamebestandsnaam & ".xlsx")
        xlApp.Quit()

        releaseObject(xlApp)
        releaseObject(xlWorkBook)
        releaseObject(xlWorkSheet)
        TsProgress.Value = 10
        Ts2.Text = "Afname opgemaakt"
    End Sub

    Private Sub cmdclose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdclose.Click
        dbcon.Close()
        Me.Close()
    End Sub

    Private Sub CbWeekeinde_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles CbWeekeinde.Validating
        Dim WaardenStart As Long = CLng(CbWeekStart.Text)
        Dim WaardenEinde As Long = CLng(CbWeekeinde.Text)

        If WaardenEinde < WaardenStart Then
            ErrorProvider1.SetError(CbWeekeinde, "De einde week dient een groter getal te hebben als de start week.")
        Else
            ErrorProvider1.SetError(CbWeekeinde, "")
            INSTAT_AantalWeken = WaardenEinde - WaardenStart 'Aantal weken voor rapportage
        End If

    End Sub

    Private Sub ChkbFabrikantonly_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChkbFabrikantonly.CheckedChanged
        If ChkbFabrikantonly.Checked = True Then
            CbJaartal.Enabled = True
            CbMerk.Enabled = False
        Else
            CbJaartal.Enabled = False
            CbMerk.Enabled = True
        End If
    End Sub

    'Function Getrecordnummers(ByVal StringMYSQL As String) As Integer
    '    Dim DR_Aantal As MySqlDataReader
    '    Dim PLstring As String
    '    Dim PLstringcode As String
    '    SQLCmd = New MySqlCommand(StringMYSQL, dbcon)
    '    DR_Aantal = SQLCmd.ExecuteReader
    '    While DR_Aantal.Read
    '        Return (DR_Aantal.Item("CountArt"))
    '    End While
    '    DR_Aantal.Close()
    'End Function

    Function ArtikelModule_PrivateLabel(ByVal Artnr As String) As String
        Dim DRPL As MySqlDataReader
        Dim PLstring As String
        Dim PLstringcode As String
        strQeury = "SELECT tblart.A_nr, tblart.A_plcode, tblart.A_PL FROM tblart WHERE tblart.A_nr = " & Artnr & ""
        SQLCmd = New MySqlCommand(strQeury, dbcon)
        DRPL = SQLCmd.ExecuteReader
        While DRPL.Read
            If DRPL.Item("A_PL") = 0 Then PLstring = "Geen PL"
            If DRPL.Item("A_PL") = 1 Then PLstring = "PL"
            If DRPL.Item("A_PL") = -1 Then PLstring = "PL"
            If DRPL.Item("A_PL") = 4 Then PLstring = "PL LOG"
            If DRPL.Item("A_plcode") = 0 Then PLstringcode = "0"
            If DRPL.Item("A_plcode") = 1 Then PLstringcode = "1"
            If DRPL.Item("A_plcode") = 5 Then PLstringcode = "5"
            If DRPL.Item("A_plcode") = 8 Then PLstringcode = "8"
            If DRPL.Item("A_plcode") = 10 Then PLstringcode = "10"
            Return PLstring & " / " & PLstringcode
        End While
        CbMerk.Sorted = True
        CbMerk.Enabled = True
        CbJaartal.Sorted = True
        DRPL.Close()
    End Function

    Function ArtikelModule_LaatstePrijs(ByVal artnr As String) As Decimal
        Dim DRLP As MySqlDataReader
        strQeury = "SELECT tblart.A_nr, tblprijs.ap_jaar, tblprijs.ap_week, tblprijs.ap_prijs FROM tblprijs INNER JOIN tblart ON tblprijs.aid = tblart.aid WHERE tblprijs.ap_jaar = " & CbJaartal.Text & " AND tblart.A_nr = " & artnr & " ORDER BY tblprijs.ap_week DESC"
        SQLCmd = New MySqlCommand(strQeury, dbcon)
        DRLP = SQLCmd.ExecuteReader
        While DRLP.Read
            Return DRLP.Item("ap_prijs")
            Exit While
        End While
        DRLP.Close()
    End Function

    Function ArtikelModule_GemColli(ByVal Colli As Long) As Decimal
        Return Colli / INSTAT_AantalWeken
    End Function

    Function ArtikelModule_Omzet(ByVal Artnr As Long) As Decimal
        Dim DR_Omzet As MySqlDataReader
        strQeury = "SELECT tblart.A_nr, tblart_omzet.ao_jaar, tblart_omzet.ao_week, sum(tblart_omzet.ao_omzet) AS expr1 FROM tblart_omzet INNER JOIN tblart ON tblart_omzet.AID = tblart.aid WHERE tblart.A_nr = " & Artnr & " AND tblart_omzet.ao_jaar = " & CbJaartal.Text & " AND tblart_omzet.ao_week BETWEEN " & CbWeekStart.Text & " AND " & CbWeekeinde.Text & " GROUP BY tblart.A_nr, tblart_omzet.ao_jaar"
        SQLCmd = New MySqlCommand(strQeury, dbcon)
        DR_Omzet = SQLCmd.ExecuteReader
        While DR_Omzet.Read
            Return DR_Omzet.Item("expr1")
            Exit While
        End While
        DR_Omzet.Close()
    End Function

    Function ArtikelModule_Groep(ByVal Artnr As Long) As String
        Dim DR_Omzet As MySqlDataReader
        strQeury = "SELECT tblart.A_nr, tblgid.G_naam FROM tblart INNER JOIN tblgid ON tblart.A_gr = tblgid.gid WHERE tblart.A_nr = " & Artnr & " GROUP BY tblart.A_nr, tblgid.G_naam"
        SQLCmd = New MySqlCommand(strQeury, dbcon)
        DR_Omzet = SQLCmd.ExecuteReader
        While DR_Omzet.Read
            Return DR_Omzet.Item("G_naam")
            Exit While
        End While
        DR_Omzet.Close()
    End Function

    Private Sub CbWeekeinde_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CbWeekeinde.SelectedIndexChanged
        If CbWeekeinde.Text <> "" Then
            CmdUitvoeren.Enabled = True
        Else

        End If
    End Sub

    Private Sub CmdReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdReset.Click
        CmdUitvoeren.Enabled = False
        CbWeekeinde.Enabled = False
        CbWeekStart.Enabled = False
        CbMerk.Enabled = False
        CbJaartal.Enabled = False
        RbAfname1.Enabled = False
        RbAfname2.Enabled = False
        CbWeekeinde.Text = ""
        CbWeekStart.Text = ""
        CbFabrikant.Text = ""
        CbMerk.Text = ""
        CbJaartal.Text = ""
        Ts2.Text = "Reset gereed!"
    End Sub


End Class
 
Nu heb ik meerdere connections gemaakt die opengaan als de rapportage gemaakt word.
De connections zijn er 4 stuks specifieke voor de losse modules.
Na elke keer dat de module aangeroepen word word de datareader gesloten voorbeeld:
Code:
DR.close()
.
Maar nu zegt hij weer dat er een datareader geopend is.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan