I have a class that implements IDataReader and the needed functions are written, but I get an error message stating
Class ‘CSVDataReader’ must implement ‘Function GetBoolean(i As Integer) As Boolean’ for interface ‘System.Data.IDataRecord’.
IDataReader has many functions and properties. How do I implement the functions without rewriting them all?
Here is my class
Public Class CSVDataReader
Implements IDataReader
Private stream As StreamReader
Private columnsByName As New Dictionary(Of String, Integer)()
Private columnsByOrdinal As New Dictionary(Of Integer, String)()
Private currentRow As String()
Private _isClosed As Boolean = True
Public Sub New(fileName As String)
If Not File.Exists(fileName) Then
Throw New Exception("File [" & fileName & "] does not exist.")
End If
Me.stream = New StreamReader(fileName)
Dim headers As String() = stream.ReadLine().Split(",")
For i As Integer = 0 To headers.Length - 1
columnsByName.Add(headers(i), i)
columnsByOrdinal.Add(i, headers(i))
Next
_isClosed = False
End Sub
Public Sub Close()
If stream IsNot Nothing Then
stream.Close()
End If
_isClosed = True
End Sub
Public ReadOnly Property FieldCount() As Integer
Get
Return columnsByName.Count
End Get
End Property
''' <summary>
''' This is the main function that does the work - it reads in the next line of data and parses the values into ordinals.
''' </summary>
''' <returns>A value indicating whether the EOF was reached or not.</returns>
Public Function Read() As Boolean
If stream Is Nothing Then
Return False
End If
If stream.EndOfStream Then
Return False
End If
currentRow = stream.ReadLine().Split(",")
Return True
End Function
Public Function GetValue(i As Integer) As Object
Return currentRow(i)
End Function
Public Function GetName(i As Integer) As String
Return columnsByOrdinal(i)
End Function
Public Function GetOrdinal(name As String) As Integer
Return columnsByName(name)
End Function
Public Function GetOrdinal(name As String) As Integer
Return columnsByName(name)
End Function
End Class
You have to implement all the methods and properties.
An interface is a contract – if an object says it can provide the services listed on the interface, it has to provide all of them. An interface is not a base class – there is no “template” code to fall back on if you don’t implement something.
It’s OK not to put any code in the methods/properties you aren’t interested in (I usually put
Throw New NotImplementedExceptionso I know when I’ve inadvertently called a method I wasn’t planning to). But the stubs have to be there.