Toon posts:

[VB.NET] Hulp progressbar + dataset & textfile + newline...

Pagina: 1
Acties:

Onderwerpen


  • BETA911
  • Registratie: Januari 2007
  • Laatst online: 01-02 10:54
Guys,

Ben ik weer eens. Heb me vandaag de hele dag rot zitten zoeken en proberen maar kom niet op een oplossing. Misschien dat iemand weet hoe het precies moet, of me in de richting duwen van.

Ik heb dus een CSV bestand dat de laatste row uit een DB3 bestand haalt. Dit doet hij elke 10min (instelbaar). Zover werkt de code dat hij het bestand aanmaakt en de laatste row geschreven heeft. Echter moet ik ook een controle hebben dat als het bestand bestaat, hij (na die 10min, bij de volgende schrijf actie) eerst een nieuwe lijn doet en dan de nieuwe row toevoegd.
Code zover:
Visual Basic:
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
Public Sub exportDGVToCSV(ByVal strExportFileName As String, ByVal DataGridView As DataGridView)
        Try
            Dim strDelimiter As String = ";"
            Dim strRowData As String = ""
            Dim indexRow As Integer = DataGridView.RowCount() - 1
            Dim aantalKol As Integer = DataGridView.ColumnCount - 1
            Dim datum As String = Regex.Match(DataGridView.Rows(indexRow).Cells(0).Value.ToString, "[0-9]{1,}/[0-9]{1,}/[0-9]{2,}").ToString
            Dim jaar As String = Year(datum)
            Dim maand As String = MonthName(Month(DateTime.Parse(datum)))
            Dim dag As String = DateTime.Parse(datum).DayOfWeek
            Dim path As String = System.IO.Path.GetDirectoryName(destination.FileName) & "\" & jaar & "\" & maand
            Directory.CreateDirectory(path)
            Dim bestandsNaam As String = dag & "-" & maand & "-" & jaar
            strExportFileName = path & "\" & bestandsNaam & ".csv"
            Dim myWriter As StreamWriter
            If Not File.Exists(strExportFileName) Then
                myWriter = File.CreateText(strExportFileName)
            Else
               'append de nieuwe rij
            End If
            strRowData = ""
            For i = 0 To aantalKol Step 1
                strRowData = strRowData & DataGridView.Rows(indexRow).Cells(i).Value.ToString & strDelimiter & " "
            Next
            myWriter.WriteLine(strRowData)
            myWriter.Flush()
            myWriter.Close()
            MessageBox.Show("Klaar met schrijven!" & vbCrLf & "Bestand is opgeslagen in: " & path, "Succes", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        Catch ex As Exception
            frmMain.throwErrorMsg(9, "Error")
        End Try
    End Sub


En dan het volgende. Ik dacht (even snel) een progressbar te gebruiken bij het inladen van de data in een dataset. Dit deed ik als volgt:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Sub mnuOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuOpen.Click
        Dim openFile As New OpenFileDialog
        openFile.Filter = "DB3 files (*.db3)|*.db3"
        If (openFile.ShowDialog() = Windows.Forms.DialogResult.OK) Then
            Dim con As SQLiteConnection = New SQLiteConnection("Data Source=" & openFile.FileName & ";")
            Dim da As SQLiteDataAdapter = New SQLiteDataAdapter("SELECT * FROM data_items", con)
            Dim ds As DataSet = New DataSet
            While da.Fill(ds, "data_items")
                pbarLoad.PerformStep()
                If pbarLoad.Value = pbarLoad.Maximum Then
                    pbarLoad.Value = 0
                End If
            End While
            dgvMain.DataSource = ds.Tables(0)
            con.Close()
            con.Dispose()
            pbarLoad.Value = 0
        End If
    End Sub


Maar het gekke is, hij stopt bij ongeveer 3/4 van het laden van de bar en dan stopt het programma in zijn geheel. Maximum is 100, minimum is 0, step is 1.

Als iemand een idee heeft op het eerste, of me kan zeggen wat bij tweede probleem fout is, please tell me!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 00:48

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Heb je al eens gewoon gedebugged? (Debuggen: Hoe doe ik dat?). Zet wat relevante zaken in een logfile, gebruik een trace of zet een breakpoint of gebruik 1 van de 1001 andere debugmogelijkheden die Visual Studio biedt en vertel ons eens wat daar uit kwam?

Overigens; op 't oog: Je PB heeft 100 "stapjes", je voert voor elk record een performstep() uit, maar wat nou als er maar 75 records in zitten? Dan gaat 'ie toch nogal wiedes nooit verder komen dan 75%?

Het zou ook helpen als je wat duidelijker was in je probleembeschrijving; "Ik heb dus een CSV bestand dat de laatste row uit een DB3 bestand haalt." >> Een CSV bestand dat een row uit een DB3 bestand haalt :? Een newline invoegen als 't bestand reeds bestaat lijkt me nou niet bepaald rocket-science maar ik zie daar niets van (een poging tot) terug in de code?

[Voor 48% gewijzigd door RobIII op 11-05-2011 23:51]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • BETA911
  • Registratie: Januari 2007
  • Laatst online: 01-02 10:54
RobIII schreef op woensdag 11 mei 2011 @ 23:45:
Heb je al eens gewoon gedebugged? (Debuggen: Hoe doe ik dat?). Zet wat relevante zaken in een logfile, gebruik een trace of zet een breakpoint of gebruik 1 van de 1001 andere debugmogelijkheden die Visual Studio biedt en vertel ons eens wat daar uit kwam?

Overigens; op 't oog: Je PB heeft 100 "stapjes", je voert voor elk record een performstep() uit, maar wat nou als er maar 75 records in zitten? Dan gaat 'ie toch nogal wiedes nooit verder komen dan 75%?

Het zou ook helpen als je wat duidelijker was in je probleembeschrijving; "Ik heb dus een CSV bestand dat de laatste row uit een DB3 bestand haalt." >> Een CSV bestand dat een row uit een DB3 bestand haalt :? Een newline invoegen als 't bestand reeds bestaat lijkt me nou niet bepaald rocket-science maar ik zie daar niets van (een poging tot) terug in de code?
Over het debuggen, heb een hele dag zitten proberen en debuggen maar kom er niet uit. Daarom mijn vraag hier.

Over het programma zelf, wat betreft de omschrijving.
- Programma start
- Openfiledialog -> *.db3 bestand
- Datagridview op het form word gevuld met de inhoud van de db3.
- SaveFileDialog -> laatste rij in de datagridview word opgeslagen als *.csv bestand

Na 10min gaat hij dit weer doen, echter moet ik controleren als het bestand al bestaat. Als dat zo is, dan moet ik de nieuwe rij erbij plakken op een nieuwe lijn zodat hetgeen erin stond blijft staan en niet overschreven word.. Zo simpel 'klinkt' het maar ik krijg het niet voor mekaar. Ik heb alle mogelijkheden geprobeerd met File.AppendText, File.Append, enzovoort maar niks wil lukken...

Over de PB, daarom dat ik de check erin heb gedaan als hij het maximum heeft bereikt dat de index opnieuw begint te tellen. Maar hij gaat tot 75% ongeveer en dan blijft het programma hangen. Zover ik begrijp moet hij gewoon verder gaan op lijn 14 zodra de dataset gevuld is.

  • RobIII
  • Registratie: December 2001
  • Laatst online: 00:48

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

BETA911 schreef op donderdag 12 mei 2011 @ 09:33:
Zo simpel 'klinkt' het maar ik krijg het niet voor mekaar. Ik heb alle mogelijkheden geprobeerd met File.AppendText, File.Append, enzovoort maar niks wil lukken...
Wat lukt dan niet? Waar is je (relevante!) code waarin je laat zien wat je probeert? Wat is "alle mogelijkheden"?
BETA911 schreef op donderdag 12 mei 2011 @ 09:33:
Over de PB, daarom dat ik de check erin heb gedaan als hij het maximum heeft bereikt dat de index opnieuw begint te tellen.
Dat wil je dus sowieso niet. Je kunt de PB op twee manieren (misschien wel meer) gebruiken: 1) je weet hoeveel records je gaat verwerken en interpoleert dat naar een waarde tussen 0 en 100 "procent":

code:
1
pb.value = (verwerkt_aantal_records / totaal_aantal_records) * 100


Of 2) je set het maximum van de PB gewoon op 't totaal aantal records:

code:
1
2
3
4
pb.max = totaal_aantal_records
...
...
pb.value = verwerkt_aantal_records


Da's toch gewoon basisschool rekenen :?
BETA911 schreef op donderdag 12 mei 2011 @ 09:33:
Zover ik begrijp moet hij gewoon verder gaan op lijn 14 zodra de dataset gevuld is.
Dat zou moeten gebeuren ja. Als dat niet zo is moet je gaan onderzoeken waarom dat zo is. En met 3 seconden debuggen ben je daar achter; je maakt me dan ook niet wijs dat je (fatsoenlijk) gedebugged hebt.
BETA911 schreef op donderdag 12 mei 2011 @ 09:33:
Over het debuggen, heb een hele dag zitten proberen en debuggen maar kom er niet uit.
HOE debug jij dan in vredesnaam :? Heb je hier al eens gekeken? Breakpoints gezet? Door de code heen gestepped? Een Trace gebruikt? Wat?

[Voor 11% gewijzigd door RobIII op 12-05-2011 10:18]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • BETA911
  • Registratie: Januari 2007
  • Laatst online: 01-02 10:54
RobIII schreef op donderdag 12 mei 2011 @ 10:15:
Wat lukt dan niet? Waar is je (relevante!) code waarin je laat zien wat je probeert? Wat is "alle mogelijkheden"?
Er is geen extra relevante code nodig. Het is gewoon een windows form met een DataGridView op, ik klik in het menu op Open, er komt een OpenFileDialog waarbij ik een *.db3 bestand open (database). Vervolgens vul ik mijn DataSet, en die wijs ik toe aan de DataGridView.
Ik wil dus het laden van de DataSet in de DataGridView met een ProgressBar laten zien. Bij mij gaat het openen snel (2-3 seconden) maar op oudere systemen misschien niet.
Heb juist even de code doorlopen en hij doet de PerformStep goed, ook de If check loopt gesmeerd zodra hij aan het maximum zit, vervolgens begint hij opnieuw. MAAR, ik krijg na X tijd (vermoed 60 seconden) een error als volgt (tijdens het debuggen met steps [F8]).
Error:
De CLR slaagt er al 60 seconden niet in over te schakelen van COM-context...
Met titel:
ContextSwitchDeadlock
Dat wil je dus sowieso niet. Je kunt de PB op twee manieren (misschien wel meer) gebruiken: 1) je weet hoeveel records je gaat verwerken en interpoleert dat naar een waarde tussen 0 en 100 "procent":
code:
1
pb.value = (verwerkt_aantal_records / totaal_aantal_records) * 100


Of 2) je set het maximum van de PB gewoon op 't totaal aantal records:

code:
1
2
3
4
pb.max = totaal_aantal_records
...
...
pb.value = verwerkt_aantal_records


Da's toch gewoon basisschool rekenen :?
Dat is inderdaad gewoon rekenen, maar ik weet pas het aantal records als de DataSet al in de DataGridView zit, en het laten zien van het laden moet tijdens dat laden gebeuren, anders is het niet relevant om het toe te passen, toch?
Dat zou moeten gebeuren ja. Als dat niet zo is moet je gaan onderzoeken waarom dat zo is. En met 3 seconden debuggen ben je daar achter; je maakt me dan ook niet wijs dat je (fatsoenlijk) gedebugged hebt.
Ik heb zitten debuggen de hele dag, ook zoals het in jullie FAQ staat. Ik loop niet direct naar de hulp lijn als het me niet lukt hoor. Lijkt me precies verboden hier om hulp te vragen als men niet duidelijk vermeld hoelang men al heeft zitten debuggen. Ik vraag ook enkel raad en hulp naar de juiste richting.
HOE debug jij dan in vredesnaam :? Heb je hier al eens gekeken? Breakpoints gezet? Door de code heen gestepped? Een Trace gebruikt? Wat?
EDIT:

Het wegschrijven van de laatste rijd al dan niet als een bestand bestaat of niet werkt.
Blijkbaar toch zo simpel als ik dacht, vermoedelijk gisteren te lang erop gezeten.
Visual Basic:
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
Public Sub exportDGVToCSV(ByVal strExportFileName As String, ByVal DataGridView As DataGridView)
        Try
            Dim strDelimiter As String = ";"
            Dim strRowData As String = ""
            Dim indexRow As Integer = DataGridView.RowCount() - 1
            Dim aantalKol As Integer = DataGridView.ColumnCount - 1
            Dim datum As String = Regex.Match(DataGridView.Rows(indexRow).Cells(0).Value.ToString, "[0-9]{1,}/[0-9]{1,}/[0-9]{2,}").ToString
            Dim jaar As String = Year(datum)
            Dim maand As String = MonthName(Month(DateTime.Parse(datum)))
            Dim dag As String = DateTime.Parse(datum).DayOfWeek
            Dim path As String = System.IO.Path.GetDirectoryName(destination.FileName) & "\" & jaar & "\" & maand
            Directory.CreateDirectory(path)
            Dim bestandsNaam As String = dag & "-" & maand.ToUpper & "-" & jaar
            strExportFileName = path & "\" & bestandsNaam & ".csv"
            strRowData = ""
            For i = 0 To aantalKol Step 1
                strRowData = strRowData & DataGridView.Rows(indexRow).Cells(i).Value.ToString & strDelimiter & " "
            Next
            If Not File.Exists(strExportFileName) Then
                File.AppendAllText(strExportFileName, strRowData)
            Else
                File.GetAccessControl(strExportFileName)
                File.AppendAllText(strExportFileName, vbNewLine & strRowData)
            End If
            'MessageBox.Show("Klaar met schrijven!" & vbCrLf & "Bestand is opgeslagen in: " & path, "Succes", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        Catch ex As Exception
            frmMain.throwErrorMsg(9, "Error")
        End Try
    End Sub

[Voor 27% gewijzigd door BETA911 op 12-05-2011 13:13]


  • barfieldmv
  • Registratie: Maart 2004
  • Laatst online: 01-06 11:28
Deze
Error:
De CLR slaagt er al 60 seconden niet in over te schakelen van COM-context...
Met titel:
ContextSwitchDeadlock

Is een debug error. Kan je gewoon negeren.

  • BETA911
  • Registratie: Januari 2007
  • Laatst online: 01-02 10:54
En dat zorgt er niet voor dat het programma vast loopt? Want als ik in taakbeheer kijk naar het geheugen gebruik tijdens opgestarte fase is het ongeveer 23MB, maar zodra hij vastloopt schiet hij omhoog naar 800MB en klimt een 20MB per seconde. En die error (had ik gelezen) duid op een extreem (hoog) geheugen verbruik.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee