Problem with DataTable

Almatea

New member
Joined
Oct 18, 2024
Messages
1
Programming Experience
Beginner
Hello,

I wrote a very simple class that logs certain events coming from various places in the program by calling the AddLog method

The class includes:

-a constructor that calls the array creation method and configures a timer that fires every 2 seconds.
-method of adding an entry to the AddLog table
-a method of calling a timer that first writes records to a file and then deletes these files

And everything generally works, but from time to time there are error entries from the AddLog method as follows:

91 System.Data Object reference not set to an instance of an object
5 System.Data Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection
5 System.Data DataTable internal index is corrupted

And I don't know if there is any collision of the method that deletes records and at the same time writes to the table?

Code:
Imports System.IO

Public Class Log

    Public FileWriter As StreamWriter
    Private LogTablica As DataTable = New DataTable
    Private SAVELOGTMR As System.Timers.Timer

    Sub New()

        Try
            CreateLogTable()

            SAVELOGTMR = New System.Timers.Timer
        SAVELOGTMR.Interval = 2500
        SAVELOGTMR.Stop()
        AddHandler SAVELOGTMR.Elapsed, AddressOf SAVELOGTMR_Tick

        SAVELOGTMR.Start()

        Catch ex As Exception
        End Try

    End Sub

    Private Sub SAVELOGTMR_Tick(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)

        Try

            SAVELOGTMR.Stop()

            Dim ilosc_rekordow As Integer = 0
            Dim x As Integer = 0
            Dim i As Integer = 0

            ilosc_rekordow = LogTablica.Rows.Count

            FileWriter = New StreamWriter(".\Log.log", True)

            If LogTablica.Rows.Count() <> 0 Then

                'Zrzucam do pliku
                For i = 0 To ilosc_rekordow - 1
                    FileWriter.WriteLine(CStr(LogTablica.Rows(i).Item(1)) & " " & CStr(LogTablica.Rows(i).Item(2)))
                Next

                FileWriter.Close()

                'Usuwam rekordy zapisane
                For x = 0 To ilosc_rekordow - 1
                    LogTablica.Rows.RemoveAt(0)
                    LogTablica.AcceptChanges()
                Next

            End If

            SAVELOGTMR.Start()

        Catch ex As Exception
        Finally
            SAVELOGTMR.Start()
        End Try

    End Sub

    Public Sub AddLog(ByVal logitem As String)

        Try
            Dim Row As DataRow

            Row = LogTablica.NewRow()
            Row("DateTime") = Format(Now, "yyyy-MM-dd HH:mm:ss.fff")
            Row("LogItem") = logitem
            LogTablica.Rows.Add(Row)

            LogTablica.AcceptChanges()

        Catch ex As Exception
        End Try

    End Sub

    Private Sub CreateLogTable()

        Dim DateTime As DataColumn = New DataColumn("DateTime", GetType(String))
        Dim LogItem As DataColumn = New DataColumn("LogItem", GetType(String))

        Try

            LogTablica.Columns.Add(DateTime)
            LogTablica.Columns.Add(LogItem)

        Catch ex As Exception
            Call Error_sub_main(System.Reflection.MethodBase.GetCurrentMethod.Name.ToString)
        End Try

    End Sub

End Class
 
Firstly, there's no need or point to calling Stop on the Timer in its Elapsed event handler. Just make sure that AutoReset is False and it will only raise one event on its own and you will have to call Start to get it to raise another.
 
You should be aware that the Elapsed event is raised on a ThreadPool thread by default, so it's quite possible that your methods are executing at the same time. Think about what would need to be synchronised and modify the code accordingly.
 
Back
Top