' <fileinfo name="EmployeeTerritoriesCollection_Base.vb">
'       <copyright>
'           All rights reserved.
'       </copyright>
'       <remarks>
'           Do not change this source code manually. Changes to this file may 
'           cause incorrect behavior and will be lost if the code is regenerated.
'       </remarks>
'       <generator rewritefile="True" infourl="http://www.SharpPower.com">RapTier</generator>
' </fileinfo>

Option Strict Off
Option Explicit On

Imports System
Imports System.Data

''' <summary>
''' The base class for <see cref="EmployeeTerritoriesCollection"/>. Provides methods 
''' for common database table operations. 
''' </summary>
''' <remarks>
''' Do not change this source code. Update the <see cref="EmployeeTerritoriesCollection"/>
''' class if you need to add or change some functionality.
''' </remarks>
Public MustInherit Class EmployeeTerritoriesCollection_Base
    ' Constants
    Public Const EmployeeIDColumnName As String = "EmployeeID"
    Public Const TerritoryIDColumnName As String = "TerritoryID"

    ' Instance fields
    Private _db As Northwind

    ''' <summary>
    ''' Initializes a new instance of the <see cref="EmployeeTerritoriesCollection_Base"/> 
    ''' class with the specified <see cref="Northwind"/>.
    ''' </summary>
    ''' <param name="db">The <see cref="Northwind"/> object.</param>
    Public Sub New(db As Northwind)
        MyBase.New()
        _db = db
    End Sub

    ''' <summary>
    ''' Gets the database object that this table belongs to.
    ''' </summary>
    ''' <value>The <see cref="Northwind"/> object.</value>
    Protected ReadOnly Property Database As Northwind
        Get
            Return _db
        End Get
    End Property

    ''' <summary>
    ''' Gets an array of all records from the <c>EmployeeTerritories</c> table.
    ''' </summary>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Public Overridable Function GetAll() As EmployeeTerritoriesRow()
        Return MapRecords(CreateGetAllCommand())
    End Function

    ''' <summary>
    ''' Gets a <see cref="System.Data.DataTable"/> object that 
    ''' includes all records from the <c>EmployeeTerritories</c> table.
    ''' </summary>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Public Overridable Function GetAllAsDataTable() As DataTable
        Return MapRecordsToDataTable(CreateGetAllCommand())
    End Function

    ''' <summary>
    ''' Creates and returns an <see cref="System.Data.IDbCommand"/> object that is used
    ''' to retrieve all records from the <c>EmployeeTerritories</c> table.
    ''' </summary>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Protected Overridable Function CreateGetAllCommand() As IDbCommand
        Return _db.CreateCommand("dbo._EmployeeTerritories_GetAll", True)
    End Function

    ''' <summary>
    ''' Gets the first <see cref="EmployeeTerritoriesRow"/> objects that 
    ''' match the search condition.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. For example: 
    ''' <c>"FirstName='Smith' AND Zip=75038"</c>.</param>
    ''' <returns>An instance of <see cref="EmployeeTerritoriesRow"/> or null reference 
    ''' (Nothing in Visual Basic) if the object was not found.</returns>
    Public Function GetRow(whereSql As String) As EmployeeTerritoriesRow
        Dim totalRecordCount As Integer = -1
        Dim rows As EmployeeTerritoriesRow() = GetAsArray(whereSql, Nothing, 0, 1, totalRecordCount)
        If 0 = rows.Length Then
            Return Nothing
        End If
        Return rows(0)
    End Function

    ''' <summary>
    ''' Gets an array of <see cref="EmployeeTerritoriesRow"/> objects that 
    ''' match the search condition, in the the specified sort order.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. For example: 
    ''' <c>"FirstName='Smith' AND Zip=75038"</c>.</param>
    ''' <param name="orderBySql">The column name(s) followed by "ASC" (ascending) or "DESC" (descending).
    ''' Columns are sorted in ascending order by default. For example: <c>"LastName ASC, FirstName ASC"</c>.</param>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Public Function GetAsArray(whereSql As String, orderBySql As String) As EmployeeTerritoriesRow()
        Dim totalRecordCount As Integer = -1
        Return GetAsArray(whereSql, orderBySql, 0, Integer.MaxValue, totalRecordCount)
    End Function

    ''' <summary>
    ''' Gets an array of <see cref="EmployeeTerritoriesRow"/> objects that 
    ''' match the search condition, in the the specified sort order.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. For example:
    ''' <c>"FirstName='Smith' AND Zip=75038"</c>.</param>
    ''' <param name="orderBySql">The column name(s) followed by "ASC" (ascending) or "DESC" (descending).
    ''' Columns are sorted in ascending order by default. For example: <c>"LastName ASC, FirstName ASC"</c>.</param>
    ''' <param name="startIndex">The index of the first record to return.</param>
    ''' <param name="length">The number of records to return.</param>
    ''' <param name="totalRecordCount">A reference parameter that returns the total number 
    ''' of records in the reader object if 0 was passed into the method; otherwise it returns -1.</param>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Public Overridable Function GetAsArray(whereSql As String, orderBySql As String, _
                        startIndex As Integer, length As Integer, _
                        ByRef totalRecordCount As Integer) As EmployeeTerritoriesRow()
        Dim reader As IDataReader = _db.ExecuteReader(CreateGetCommand(whereSql, orderBySql))
        Try
            Return MapRecords(reader, startIndex, length, totalRecordCount)
        Finally
            reader.Dispose()
        End Try
    End Function

    ''' <summary>
    ''' Gets a <see cref="System.Data.DataTable"/> object filled with data that 
    ''' match the search condition, in the the specified sort order.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. For example: "FirstName='Smith' AND Zip=75038".</param>
    ''' <param name="orderBySql">The column name(s) followed by "ASC" (ascending) or "DESC" (descending).
    ''' Columns are sorted in ascending order by default. For example: "LastName ASC, FirstName ASC".</param>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Public Function GetAsDataTable(whereSql As String, orderBySql As String) As DataTable
        Dim totalRecordCount As Integer = -1
        return GetAsDataTable(whereSql, orderBySql, 0, Integer.MaxValue, totalRecordCount)
    End Function

    ''' <summary>
    ''' Gets a <see cref="System.Data.DataTable"/> object filled with data that 
    ''' match the search condition, in the the specified sort order.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. For example: "FirstName='Smith' AND Zip=75038".</param>
    ''' <param name="orderBySql">The column name(s) followed by "ASC" (ascending) or "DESC" (descending).
    ''' Columns are sorted in ascending order by default. For example: "LastName ASC, FirstName ASC".</param>
    ''' <param name="startIndex">The index of the first record to return.</param>
    ''' <param name="length">The number of records to return.</param>
    ''' <param name="totalRecordCount">A reference parameter that returns the total number 
    ''' of records in the reader object if 0 was passed into the method; otherwise it returns -1.</param>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Public Overridable Function GetAsDataTable(whereSql As String, orderBySql As String, _
                            startIndex As Integer, length As Integer, _
                            ByRef totalRecordCount As Integer) As DataTable
        Dim reader As IDataReader = _db.ExecuteReader(CreateGetCommand(whereSql, orderBySql))
        Try
            Return MapRecordsToDataTable(reader, startIndex, length, totalRecordCount)
        Finally
            reader.Dispose()
        End Try
    End Function

    ''' <summary>
    ''' Creates an <see cref="System.Data.IDbCommand"/> object for the specified search criteria.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. For example: "FirstName='Smith' AND Zip=75038".</param>
    ''' <param name="orderBySql">The column name(s) followed by "ASC" (ascending) or "DESC" (descending).
    ''' Columns are sorted in ascending order by default. For example: "LastName ASC, FirstName ASC".</param>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Protected Overridable Function CreateGetCommand(whereSql As String, _
                                            orderBySql As String) As IDbCommand
        Dim sql As String = "SELECT * FROM [dbo].[EmployeeTerritories]"
        If Not(whereSql Is Nothing) AndAlso 0 < whereSql.Length Then
            sql += " WHERE " + whereSql
        End If
        If Not(orderBySql Is Nothing) AndAlso 0 < orderBySql.Length Then
            sql += " ORDER BY " + orderBySql
        End If
        Return _db.CreateCommand(sql)
    End Function


    ''' <summary>
    ''' Gets <see cref="EmployeeTerritoriesRow"/> by the primary key.
    ''' </summary>
    ''' <param name="employeeID">The <c>EmployeeID</c> column value.</param>
    ''' <param name="territoryID">The <c>TerritoryID</c> column value.</param>
    ''' <returns>An instance of <see cref="EmployeeTerritoriesRow"/> or null reference 
    ''' (Nothing in Visual Basic) if the object was not found.</returns>
    Public Overridable Function GetByPrimaryKey(employeeID As Integer, territoryID As String) As EmployeeTerritoriesRow
        Dim cmd As IDbCommand = _db.CreateCommand("dbo._EmployeeTerritories_GetByPrimaryKey", True)
        AddParameter(cmd, "EmployeeID", employeeID)
        AddParameter(cmd, "TerritoryID", territoryID)
        Dim tempArray As EmployeeTerritoriesRow() = MapRecords(cmd)
        If 0 = tempArray.Length Then
            Return Nothing
        End If
        Return tempArray(0)
    End Function

    ''' <summary>
    ''' Gets an array of <see cref="EmployeeTerritoriesRow"/> objects 
    ''' by the <c>FK_EmployeeTerritories_Employees</c> foreign key.
    ''' </summary>
    ''' <param name="employeeID">The <c>EmployeeID</c> column value.</param>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Public Overridable Function GetByEmployeeID(employeeID As Integer) As EmployeeTerritoriesRow()
        Return MapRecords(CreateGetByEmployeeIDCommand(employeeID))
    End Function

    ''' <summary>
    ''' Gets a <see cref="System.Data.DataTable"/> object 
    ''' by the <c>FK_EmployeeTerritories_Employees</c> foreign key.
    ''' </summary>
    ''' <param name="employeeID">The <c>EmployeeID</c> column value.</param>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Public Overridable Function GetByEmployeeIDAsDataTable(employeeID As Integer) As DataTable
        Return MapRecordsToDataTable(CreateGetByEmployeeIDCommand(employeeID))
    End Function

    ''' <summary>
    ''' Creates an <see cref="System.Data.IDbCommand"/> object that can be used to 
    ''' return records by the <c>FK_EmployeeTerritories_Employees</c> foreign key.
    ''' </summary>
    ''' <param name="employeeID">The <c>EmployeeID</c> column value.</param>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Protected Overridable Function CreateGetByEmployeeIDCommand( _
                employeeID As Integer) As IDbCommand
        Dim cmd As IDbCommand = _db.CreateCommand("dbo._EmployeeTerritories_GetBy_EmployeeID", True)
        AddParameter(cmd, "EmployeeID", employeeID)
        Return cmd
    End Function

    ''' <summary>
    ''' Gets an array of <see cref="EmployeeTerritoriesRow"/> objects 
    ''' by the <c>FK_EmployeeTerritories_Territories</c> foreign key.
    ''' </summary>
    ''' <param name="territoryID">The <c>TerritoryID</c> column value.</param>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Public Overridable Function GetByTerritoryID(territoryID As String) As EmployeeTerritoriesRow()
        Return MapRecords(CreateGetByTerritoryIDCommand(territoryID))
    End Function

    ''' <summary>
    ''' Gets a <see cref="System.Data.DataTable"/> object 
    ''' by the <c>FK_EmployeeTerritories_Territories</c> foreign key.
    ''' </summary>
    ''' <param name="territoryID">The <c>TerritoryID</c> column value.</param>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Public Overridable Function GetByTerritoryIDAsDataTable(territoryID As String) As DataTable
        Return MapRecordsToDataTable(CreateGetByTerritoryIDCommand(territoryID))
    End Function

    ''' <summary>
    ''' Creates an <see cref="System.Data.IDbCommand"/> object that can be used to 
    ''' return records by the <c>FK_EmployeeTerritories_Territories</c> foreign key.
    ''' </summary>
    ''' <param name="territoryID">The <c>TerritoryID</c> column value.</param>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Protected Overridable Function CreateGetByTerritoryIDCommand( _
                territoryID As String) As IDbCommand
        Dim cmd As IDbCommand = _db.CreateCommand("dbo._EmployeeTerritories_GetBy_TerritoryID", True)
        AddParameter(cmd, "TerritoryID", territoryID)
        Return cmd
    End Function

    ''' <summary>
    ''' Adds a new record into the <c>EmployeeTerritories</c> table.
    ''' </summary>
    ''' <param name="value">The <see cref="EmployeeTerritoriesRow"/> object to be inserted.</param>
    Public Overridable Sub Insert(value As EmployeeTerritoriesRow)
        Dim cmd As IDbCommand = _db.CreateCommand("dbo._EmployeeTerritories_Insert", true)
        AddParameter(cmd, "EmployeeID", value.EmployeeID)
        AddParameter(cmd, "TerritoryID", value.TerritoryID)
        cmd.ExecuteNonQuery()
    End Sub

    ''' <summary>
    ''' Deletes the specified object from the <c>EmployeeTerritories</c> table.
    ''' </summary>
    ''' <param name="value">The <see cref="EmployeeTerritoriesRow"/> object to delete.</param>
    ''' <returns>true if the record was deleted; otherwise, false.</returns>
    Public Function Delete(value As EmployeeTerritoriesRow) As Boolean
        Return DeleteByPrimaryKey(value.EmployeeID, value.TerritoryID)
    End Function

    ''' <summary>
    ''' Deletes a record from the <c>EmployeeTerritories</c> table using
    ''' the specified primary key.
    ''' </summary>
    ''' <param name="employeeID">The <c>EmployeeID</c> column value.</param>
    ''' <param name="territoryID">The <c>TerritoryID</c> column value.</param>
    ''' <returns>true if the record was deleted; otherwise, false.</returns>
    Public Overridable Function DeleteByPrimaryKey(employeeID As Integer, territoryID As String) As Boolean
        Dim cmd As IDbCommand = _db.CreateCommand("dbo._EmployeeTerritories_DeleteByPrimaryKey", true)
        AddParameter(cmd, "EmployeeID", employeeID)
        AddParameter(cmd, "TerritoryID", territoryID)
        Return 0 < cmd.ExecuteNonQuery()
    End Function

    ''' <summary>
    ''' Deletes records from the <c>EmployeeTerritories</c> table using the 
    ''' <c>FK_EmployeeTerritories_Employees</c> foreign key.
    ''' </summary>
    ''' <param name="employeeID">The <c>EmployeeID</c> column value.</param>
    ''' <returns>The number of records deleted from the table.</returns>
    Public Function DeleteByEmployeeID(employeeID As Integer) As Integer
        Return CreateDeleteByEmployeeIDCommand(employeeID).ExecuteNonQuery()
    End Function

    ''' <summary>
    ''' Creates an <see cref="System.Data.IDbCommand"/> object that can be used to
    ''' delete records using the <c>FK_EmployeeTerritories_Employees</c> foreign key.
    ''' </summary>
    ''' <param name="employeeID">The <c>EmployeeID</c> column value.</param>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Public Overridable Function CreateDeleteByEmployeeIDCommand(employeeID As Integer) As IDbCommand
        Dim cmd As IDbCommand = _db.CreateCommand("dbo._EmployeeTerritories_DeleteBy_EmployeeID", True)
        AddParameter(cmd, "EmployeeID", employeeID)
        Return cmd
    End Function

    ''' <summary>
    ''' Deletes records from the <c>EmployeeTerritories</c> table using the 
    ''' <c>FK_EmployeeTerritories_Territories</c> foreign key.
    ''' </summary>
    ''' <param name="territoryID">The <c>TerritoryID</c> column value.</param>
    ''' <returns>The number of records deleted from the table.</returns>
    Public Function DeleteByTerritoryID(territoryID As String) As Integer
        Return CreateDeleteByTerritoryIDCommand(territoryID).ExecuteNonQuery()
    End Function

    ''' <summary>
    ''' Creates an <see cref="System.Data.IDbCommand"/> object that can be used to
    ''' delete records using the <c>FK_EmployeeTerritories_Territories</c> foreign key.
    ''' </summary>
    ''' <param name="territoryID">The <c>TerritoryID</c> column value.</param>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Public Overridable Function CreateDeleteByTerritoryIDCommand(territoryID As String) As IDbCommand
        Dim cmd As IDbCommand = _db.CreateCommand("dbo._EmployeeTerritories_DeleteBy_TerritoryID", True)
        AddParameter(cmd, "TerritoryID", territoryID)
        Return cmd
    End Function

    ''' <summary>
    ''' Deletes <c>EmployeeTerritories</c> records that match the specified criteria.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. 
    ''' For example: <c>"FirstName='Smith' AND Zip=75038"</c>.</param>
    ''' <returns>The number of deleted records.</returns>
    Public Function Delete(whereSql As String) As Integer
        Return CreateDeleteCommand(whereSql).ExecuteNonQuery()
    End Function

    ''' <summary>
    ''' Creates an <see cref="System.Data.IDbCommand"/> object that can be used 
    ''' to delete <c>EmployeeTerritories</c> records that match the specified criteria.
    ''' </summary>
    ''' <param name="whereSql">The SQL search condition. 
    ''' For example: <c>"FirstName='Smith' AND Zip=75038"</c>.</param>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Protected Overridable Function CreateDeleteCommand(whereSql As String) As IDbCommand
        Dim sql As String = "DELETE FROM [dbo].[EmployeeTerritories]"
        If Not(whereSql Is Nothing) AndAlso 0 < whereSql.Length Then
            sql += " WHERE " + whereSql
        End If
        Return _db.CreateCommand(sql)
    End Function

    ''' <summary>
    ''' Deletes all records from the <c>EmployeeTerritories</c> table.
    ''' </summary>
    ''' <returns>The number of deleted records.</returns>
    Public Function DeleteAll() As Integer
        Return _db.CreateCommand("dbo._EmployeeTerritories_DeleteAll", true).ExecuteNonQuery()
    End Function

    ''' <summary>
    ''' Reads data using the specified command and returns 
    ''' an array of mapped objects.
    ''' </summary>
    ''' <param name="command">The <see cref="System.Data.IDbCommand"/> object.</param>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Protected Function MapRecords(command As IDbCommand) As EmployeeTerritoriesRow()
        Dim reader As IDataReader = _db.ExecuteReader(command)
        Try
            Return MapRecords(reader)
        Finally
            reader.Dispose()
        End Try
    End Function

    ''' <summary>
    ''' Reads data from the provided data reader and returns 
    ''' an array of mapped objects.
    ''' </summary>
    ''' <param name="reader">The <see cref="System.Data.IDataReader"/> object to read data from the table.</param>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Protected Function MapRecords(reader As IDataReader) As EmployeeTerritoriesRow()
        Dim totalRecordCount As Integer = -1
        Return MapRecords(reader, 0, Integer.MaxValue, totalRecordCount)
    End Function

    ''' <summary>
    ''' Reads data from the provided data reader and returns 
    ''' an array of mapped objects.
    ''' </summary>
    ''' <param name="reader">The <see cref="System.Data.IDataReader"/> object to read data from the table.</param>
    ''' <param name="startIndex">The index of the first record to map.</param>
    ''' <param name="length">The number of records to map.</param>
    ''' <param name="totalRecordCount">A reference parameter that returns the total number 
    ''' of records in the reader object if 0 was passed into the method; otherwise it returns -1.</param>
    ''' <returns>An array of <see cref="EmployeeTerritoriesRow"/> objects.</returns>
    Protected Overridable Function MapRecords(reader As IDataReader, startIndex As Integer, _
                        length As Integer, ByRef totalRecordCount As Integer) As EmployeeTerritoriesRow()
        If 0 > startIndex Then
            Throw New ArgumentOutOfRangeException("startIndex", startIndex, "StartIndex cannot be less than zero.")
        End If
        If 0 > length Then
            Throw New ArgumentOutOfRangeException("length", length, "Length cannot be less than zero.")
        End If

        Dim employeeIDColumnIndex As Integer = reader.GetOrdinal("EmployeeID")
        Dim territoryIDColumnIndex As Integer = reader.GetOrdinal("TerritoryID")

        Dim recordList As System.Collections.ArrayList = New System.Collections.ArrayList()
        Dim ri As Integer = -startIndex
        While(reader.Read())
            ri = ri + 1
            If ri > 0 AND ri <= length Then
                Dim record As EmployeeTerritoriesRow = New EmployeeTerritoriesRow()
                recordList.Add(record)

                record.EmployeeID = Convert.ToInt32(reader.GetValue(employeeIDColumnIndex))
                record.TerritoryID = Convert.ToString(reader.GetValue(territoryIDColumnIndex))

                If ri = length AND 0 <> totalRecordCount Then
                    Exit While
                End If
            End If
        End While
        
        If 0 = totalRecordCount
            totalRecordCount = ri + startIndex
        Else
            totalRecordCount = -1
        End If

        Return CType(recordList.ToArray(GetType(EmployeeTerritoriesRow)), EmployeeTerritoriesRow())
    End Function

    ''' <summary>
    ''' Reads data using the specified command and returns 
    ''' a filled <see cref="System.Data.DataTable"/> object.
    ''' </summary>
    ''' <param name="command">The <see cref="System.Data.IDbCommand"/> object.</param>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Protected Function MapRecordsToDataTable(command As IDbCommand) As DataTable
        Dim reader As IDataReader = _db.ExecuteReader(command)
        Try
            Return MapRecordsToDataTable(reader)
        Finally
            reader.Dispose()
        End Try
    End Function
    
    ''' <summary>
    ''' Reads data from the provided data reader and returns 
    ''' a filled <see cref="System.Data.DataTable"/> object.
    ''' </summary>
    ''' <param name="reader">The <see cref="System.Data.IDataReader"/> object to read data from the table.</param>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Protected Function MapRecordsToDataTable(reader As IDataReader) As DataTable
        Dim totalRecordCount As Integer = 0
        Return MapRecordsToDataTable(reader, 0, Integer.MaxValue, totalRecordCount)
    End Function
    
    ''' <summary>
    ''' Reads data from the provided data reader and returns 
    ''' a filled <see cref="System.Data.DataTable"/> object.
    ''' </summary>
    ''' <param name="reader">The <see cref="System.Data.IDataReader"/> object to read data from the table.</param>
    ''' <param name="startIndex">The index of the first record to read.</param>
    ''' <param name="length">The number of records to read.</param>
    ''' <param name="totalRecordCount">A reference parameter that returns the total number 
    ''' of records in the reader object if 0 was passed into the method; otherwise it returns -1.</param>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Protected Overridable Function MapRecordsToDataTable(reader As IDataReader, startIndex As Integer, _
                            length As Integer, ByRef totalRecordCount As Integer) As DataTable
        If 0 > startIndex Then
            Throw New ArgumentOutOfRangeException("startIndex", startIndex, "StartIndex cannot be less than zero.")
        End If
        If 0 > length Then
            Throw New ArgumentOutOfRangeException("length", length, "Length cannot be less than zero.")
        End If

        Dim columnCount As Integer = reader.FieldCount
        Dim ri As Integer = -startIndex
        
        Dim dataTable As DataTable = CreateDataTable()
        dataTable.BeginLoadData()
        Dim values(columnCount - 1) As Object
        
        While(reader.Read())
            ri = ri + 1
            If ri > 0 AND ri <= length Then
                reader.GetValues(values)
                dataTable.LoadDataRow(values, True)

                If ri = length AND 0 <> totalRecordCount Then
                    Exit While
                End If
            End If
        End While
        dataTable.EndLoadData()

        If 0 = totalRecordCount
            totalRecordCount = ri + startIndex
        Else
            totalRecordCount = -1
        End If

        Return dataTable
    End Function

    ''' <summary>
    ''' Converts <see cref="System.Data.DataRow"/> to <see cref="EmployeeTerritoriesRow"/>.
    ''' </summary>
    ''' <param name="row">The <see cref="System.Data.DataRow"/> object to be mapped.</param>
    ''' <returns>A reference to the <see cref="EmployeeTerritoriesRow"/> object.</returns>
    Protected Overridable Function MapRow(row As DataRow) As EmployeeTerritoriesRow
        Dim mappedObject As EmployeeTerritoriesRow = New EmployeeTerritoriesRow()
        Dim dataTable As DataTable = row.Table
        Dim dataColumn As DataColumn
        ' Column "EmployeeID"
        dataColumn = dataTable.Columns("EmployeeID")
        If Not row.IsNull(dataColumn) Then
            mappedObject.EmployeeID = CType(row(dataColumn), Integer)
        End If
        ' Column "TerritoryID"
        dataColumn = dataTable.Columns("TerritoryID")
        If Not row.IsNull(dataColumn) Then
            mappedObject.TerritoryID = CType(row(dataColumn), String)
        End If
        Return mappedObject
    End Function

    ''' <summary>
    ''' Creates a <see cref="System.Data.DataTable"/> object for 
    ''' the <c>EmployeeTerritories</c> table.
    ''' </summary>
    ''' <returns>A reference to the <see cref="System.Data.DataTable"/> object.</returns>
    Protected Overridable Function CreateDataTable() As DataTable
        Dim dataTable As DataTable = new DataTable()
        dataTable.TableName = "EmployeeTerritories"
        Dim dataColumn As DataColumn
        ' Create the "EmployeeID" column
        dataColumn = dataTable.Columns.Add("EmployeeID", GetType(Integer))
        dataColumn.AllowDBNull = False
        ' Create the "TerritoryID" column
        dataColumn = dataTable.Columns.Add("TerritoryID", GetType(String))
        dataColumn.MaxLength = 20
        dataColumn.AllowDBNull = False
        Return dataTable
    End Function
    
    ''' <summary>
    ''' Adds a new parameter to the specified command.
    ''' </summary>
    ''' <param name="cmd">The <see cref="System.Data.IDbCommand"/> object to add the parameter to.</param>
    ''' <param name="paramName">The name of the parameter.</param>
    ''' <param name="value">The value of the parameter.</param>
    ''' <returns>A reference to the added parameter.</returns>
    Protected Overridable Function AddParameter(cmd As IDbCommand, paramName As String, _
                                value As Object) As IDbDataParameter
        Dim parameter As IDbDataParameter
        Select paramName
            Case "EmployeeID"
                parameter = _db.AddParameter(cmd, paramName, DbType.Int32, value)
            Case "TerritoryID"
                parameter = _db.AddParameter(cmd, paramName, DbType.String, value)
            Case Else
                Throw New ArgumentException("Unknown parameter name (" + paramName + ").")
        End Select
        Return parameter
    End Function
End Class