
Patrick B. answered 05/07/21
Math and computer tutor/teacher
Structure _TDataRec
Public recNum As Integer
Public name As String
Public address As String
End Structure
Public Sub Parse(ByRef dataRec As _TDataRec, inbuff As String)
Dim tokens() As String = inbuff.Split(",")
dataRec.recNum = Val(tokens(0).Trim())
dataRec.name = tokens(1)
dataRec.address = tokens(2)
End Sub
Public Function SerializeToCSV(dataRec As _TDataRec)
Dim outbuff As String
outbuff = Str(dataRec.recNum) & "," & dataRec.name & "," & dataRec.address
SerializeToCSV = outbuff
End Function
Public Sub Dump(dataRec As _TDataRec, strMsg As String)
If (Not IsNothing(strMsg)) Then
Console.WriteLine("************************************")
Console.WriteLine(strMsg)
End If
Console.WriteLine("**********************************************")
Console.WriteLine(" rec # = " & dataRec.recNum)
Console.WriteLine(" name = >" & dataRec.name & "<")
Console.WriteLine(" address = >" & dataRec.address & "<")
End Sub
Structure _TDbTable
Public dataRecs() As _TDataRec
Public numDataRecs As Integer
End Structure
Public Sub DBTable_Init(ByRef db As _TDbTable)
ReDim db.dataRecs(1)
db.numDataRecs = 0
End Sub
Public Sub InsertAddNew(ByRef db As _TDbTable, newDataRec As _TDataRec)
If (db.numDataRecs = 0) Then
db.dataRecs(0) = newDataRec
db.numDataRecs = 1
Else
db.numDataRecs = db.numDataRecs + 1
ReDim Preserve db.dataRecs(db.numDataRecs)
db.dataRecs(db.numDataRecs - 1) = newDataRec
End If
End Sub
Public Sub DeleteRemove(ByRef db As _TDbTable, iIndexPos As Integer)
If (iIndexPos >= 0 And iIndexPos < db.numDataRecs) Then
For iLoop = iIndexPos To db.numDataRecs - 1
db.dataRecs(iLoop) = db.dataRecs(iLoop + 1)
Next
db.numDataRecs = db.numDataRecs - 1
ReDim Preserve db.dataRecs(db.numDataRecs)
End If
End Sub
Public Sub Update(ByRef db As _TDbTable, iIndexPos As Integer, dataRec As _TDataRec)
If (iIndexPos >= 0 And iIndexPos < db.numDataRecs) Then
db.dataRecs(iIndexPos) = dataRec
End If
End Sub
Public Sub IndexerGetAtIndex(db As _TDbTable, iIndexPos As Integer, ByRef dataRec As _TDataRec)
'deep copies: always return COPY to the caller, not the address; caller CANNOT change original
If (iIndexPos >= 0 And iIndexPos < db.numDataRecs) Then
dataRec.recNum = db.dataRecs(iIndexPos).recNum
dataRec.name = db.dataRecs(iIndexPos).name
dataRec.address = db.dataRecs(iIndexPos).address
End If
End Sub
Public Sub ReadFile(filename As String, ByRef db As _TDbTable)
On Error GoTo ErrHandler
Dim curDataRec As _TDataRec
Dim fileReader As System.IO.StreamReader
Dim stringReader As String = "?"
db.numDataRecs = 0
fileReader = My.Computer.FileSystem.OpenTextFileReader(filename)
curDataRec = Nothing
While True
stringReader = fileReader.ReadLine()
If IsNothing(stringReader) Then
Exit While
End If
Parse(curDataRec, stringReader)
InsertAddNew(db, curDataRec)
End While
fileReader.Close()
ErrHandler:
Console.WriteLine("Error opening/reading file ")
Return
End Sub
Public Sub WriteFile(filename As String, ByRef db As _TDbTable)
On Error GoTo ErrHandler
Dim curDataRec As _TDataRec
Dim fileWriter As System.IO.StreamWriter
Dim outbuff As String
fileWriter = My.Computer.FileSystem.OpenTextFileWriter(filename, False)
For iLoop = 0 To db.numDataRecs - 1
outbuff = SerializeToCSV(db.dataRecs(iLoop))
fileWriter.WriteLine(outbuff)
Next
fileWriter.Close()
ErrHandler:
Console.WriteLine("Error opening/writing file ")
Return
End Sub