' <fileinfo name="InvoicesCollection_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="InvoicesCollection"/>. Provides methods 
''' for common database view operations. 
''' </summary>
''' <remarks>
''' Do not change this source code. Update the <see cref="InvoicesCollection"/>
''' class if you need to add or change some functionality.
''' </remarks>
Public MustInherit Class InvoicesCollection_Base
    ' Constants
    Public Const ShipNameColumnName As String = "ShipName"
    Public Const ShipAddressColumnName As String = "ShipAddress"
    Public Const ShipCityColumnName As String = "ShipCity"
    Public Const ShipRegionColumnName As String = "ShipRegion"
    Public Const ShipPostalCodeColumnName As String = "ShipPostalCode"
    Public Const ShipCountryColumnName As String = "ShipCountry"
    Public Const CustomerIDColumnName As String = "CustomerID"
    Public Const CustomerNameColumnName As String = "CustomerName"
    Public Const AddressColumnName As String = "Address"
    Public Const CityColumnName As String = "City"
    Public Const RegionColumnName As String = "Region"
    Public Const PostalCodeColumnName As String = "PostalCode"
    Public Const CountryColumnName As String = "Country"
    Public Const SalespersonColumnName As String = "Salesperson"
    Public Const OrderIDColumnName As String = "OrderID"
    Public Const OrderDateColumnName As String = "OrderDate"
    Public Const RequiredDateColumnName As String = "RequiredDate"
    Public Const ShippedDateColumnName As String = "ShippedDate"
    Public Const ShipperNameColumnName As String = "ShipperName"
    Public Const ProductIDColumnName As String = "ProductID"
    Public Const ProductNameColumnName As String = "ProductName"
    Public Const UnitPriceColumnName As String = "UnitPrice"
    Public Const QuantityColumnName As String = "Quantity"
    Public Const DiscountColumnName As String = "Discount"
    Public Const ExtendedPriceColumnName As String = "ExtendedPrice"
    Public Const FreightColumnName As String = "Freight"

    ' Instance fields
    Private _db As Northwind

    ''' <summary>
    ''' Initializes a new instance of the <see cref="InvoicesCollection_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 view 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>Invoices</c> view.
    ''' </summary>
    ''' <returns>An array of <see cref="InvoicesRow"/> objects.</returns>
    Public Overridable Function GetAll() As InvoicesRow()
        Return MapRecords(CreateGetAllCommand())
    End Function

    ''' <summary>
    ''' Gets a <see cref="System.Data.DataTable"/> object that 
    ''' includes all records from the <c>Invoices</c> view.
    ''' </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>Invoices</c> view.
    ''' </summary>
    ''' <returns>A reference to the <see cref="System.Data.IDbCommand"/> object.</returns>
    Protected Overridable Function CreateGetAllCommand() As IDbCommand
        Return _db.CreateCommand("dbo._Invoices_GetAll", True)
    End Function

    ''' <summary>
    ''' Gets the first <see cref="InvoicesRow"/> 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="InvoicesRow"/> or null reference 
    ''' (Nothing in Visual Basic) if the object was not found.</returns>
    Public Function GetRow(whereSql As String) As InvoicesRow
        Dim totalRecordCount As Integer = -1
        Dim rows As InvoicesRow() = 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="InvoicesRow"/> 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="InvoicesRow"/> objects.</returns>
    Public Function GetAsArray(whereSql As String, orderBySql As String) As InvoicesRow()
        Dim totalRecordCount As Integer = -1
        Return GetAsArray(whereSql, orderBySql, 0, Integer.MaxValue, totalRecordCount)
    End Function

    ''' <summary>
    ''' Gets an array of <see cref="InvoicesRow"/> 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="InvoicesRow"/> objects.</returns>
    Public Overridable Function GetAsArray(whereSql As String, orderBySql As String, _
                        startIndex As Integer, length As Integer, _
                        ByRef totalRecordCount As Integer) As InvoicesRow()
        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].[Invoices]"
        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>
    ''' 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="InvoicesRow"/> objects.</returns>
    Protected Function MapRecords(command As IDbCommand) As InvoicesRow()
        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 view.</param>
    ''' <returns>An array of <see cref="InvoicesRow"/> objects.</returns>
    Protected Function MapRecords(reader As IDataReader) As InvoicesRow()
        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 view.</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="InvoicesRow"/> objects.</returns>
    Protected Overridable Function MapRecords(reader As IDataReader, startIndex As Integer, _
                        length As Integer, ByRef totalRecordCount As Integer) As InvoicesRow()
        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 shipNameColumnIndex As Integer = reader.GetOrdinal("ShipName")
        Dim shipAddressColumnIndex As Integer = reader.GetOrdinal("ShipAddress")
        Dim shipCityColumnIndex As Integer = reader.GetOrdinal("ShipCity")
        Dim shipRegionColumnIndex As Integer = reader.GetOrdinal("ShipRegion")
        Dim shipPostalCodeColumnIndex As Integer = reader.GetOrdinal("ShipPostalCode")
        Dim shipCountryColumnIndex As Integer = reader.GetOrdinal("ShipCountry")
        Dim customerIDColumnIndex As Integer = reader.GetOrdinal("CustomerID")
        Dim customerNameColumnIndex As Integer = reader.GetOrdinal("CustomerName")
        Dim addressColumnIndex As Integer = reader.GetOrdinal("Address")
        Dim cityColumnIndex As Integer = reader.GetOrdinal("City")
        Dim regionColumnIndex As Integer = reader.GetOrdinal("Region")
        Dim postalCodeColumnIndex As Integer = reader.GetOrdinal("PostalCode")
        Dim countryColumnIndex As Integer = reader.GetOrdinal("Country")
        Dim salespersonColumnIndex As Integer = reader.GetOrdinal("Salesperson")
        Dim orderIDColumnIndex As Integer = reader.GetOrdinal("OrderID")
        Dim orderDateColumnIndex As Integer = reader.GetOrdinal("OrderDate")
        Dim requiredDateColumnIndex As Integer = reader.GetOrdinal("RequiredDate")
        Dim shippedDateColumnIndex As Integer = reader.GetOrdinal("ShippedDate")
        Dim shipperNameColumnIndex As Integer = reader.GetOrdinal("ShipperName")
        Dim productIDColumnIndex As Integer = reader.GetOrdinal("ProductID")
        Dim productNameColumnIndex As Integer = reader.GetOrdinal("ProductName")
        Dim unitPriceColumnIndex As Integer = reader.GetOrdinal("UnitPrice")
        Dim quantityColumnIndex As Integer = reader.GetOrdinal("Quantity")
        Dim discountColumnIndex As Integer = reader.GetOrdinal("Discount")
        Dim extendedPriceColumnIndex As Integer = reader.GetOrdinal("ExtendedPrice")
        Dim freightColumnIndex As Integer = reader.GetOrdinal("Freight")

        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 InvoicesRow = New InvoicesRow()
                recordList.Add(record)

                If Not reader.IsDBNull(shipNameColumnIndex) Then
                    record.ShipName = Convert.ToString(reader.GetValue(shipNameColumnIndex))
                End If
                If Not reader.IsDBNull(shipAddressColumnIndex) Then
                    record.ShipAddress = Convert.ToString(reader.GetValue(shipAddressColumnIndex))
                End If
                If Not reader.IsDBNull(shipCityColumnIndex) Then
                    record.ShipCity = Convert.ToString(reader.GetValue(shipCityColumnIndex))
                End If
                If Not reader.IsDBNull(shipRegionColumnIndex) Then
                    record.ShipRegion = Convert.ToString(reader.GetValue(shipRegionColumnIndex))
                End If
                If Not reader.IsDBNull(shipPostalCodeColumnIndex) Then
                    record.ShipPostalCode = Convert.ToString(reader.GetValue(shipPostalCodeColumnIndex))
                End If
                If Not reader.IsDBNull(shipCountryColumnIndex) Then
                    record.ShipCountry = Convert.ToString(reader.GetValue(shipCountryColumnIndex))
                End If
                If Not reader.IsDBNull(customerIDColumnIndex) Then
                    record.CustomerID = Convert.ToString(reader.GetValue(customerIDColumnIndex))
                End If
                record.CustomerName = Convert.ToString(reader.GetValue(customerNameColumnIndex))
                If Not reader.IsDBNull(addressColumnIndex) Then
                    record.Address = Convert.ToString(reader.GetValue(addressColumnIndex))
                End If
                If Not reader.IsDBNull(cityColumnIndex) Then
                    record.City = Convert.ToString(reader.GetValue(cityColumnIndex))
                End If
                If Not reader.IsDBNull(regionColumnIndex) Then
                    record.Region = Convert.ToString(reader.GetValue(regionColumnIndex))
                End If
                If Not reader.IsDBNull(postalCodeColumnIndex) Then
                    record.PostalCode = Convert.ToString(reader.GetValue(postalCodeColumnIndex))
                End If
                If Not reader.IsDBNull(countryColumnIndex) Then
                    record.Country = Convert.ToString(reader.GetValue(countryColumnIndex))
                End If
                record.Salesperson = Convert.ToString(reader.GetValue(salespersonColumnIndex))
                record.OrderID = Convert.ToInt32(reader.GetValue(orderIDColumnIndex))
                If Not reader.IsDBNull(orderDateColumnIndex) Then
                    record.OrderDate = Convert.ToDateTime(reader.GetValue(orderDateColumnIndex))
                End If
                If Not reader.IsDBNull(requiredDateColumnIndex) Then
                    record.RequiredDate = Convert.ToDateTime(reader.GetValue(requiredDateColumnIndex))
                End If
                If Not reader.IsDBNull(shippedDateColumnIndex) Then
                    record.ShippedDate = Convert.ToDateTime(reader.GetValue(shippedDateColumnIndex))
                End If
                record.ShipperName = Convert.ToString(reader.GetValue(shipperNameColumnIndex))
                record.ProductID = Convert.ToInt32(reader.GetValue(productIDColumnIndex))
                record.ProductName = Convert.ToString(reader.GetValue(productNameColumnIndex))
                record.UnitPrice = Convert.ToDecimal(reader.GetValue(unitPriceColumnIndex))
                record.Quantity = Convert.ToInt16(reader.GetValue(quantityColumnIndex))
                record.Discount = Convert.ToSingle(reader.GetValue(discountColumnIndex))
                If Not reader.IsDBNull(extendedPriceColumnIndex) Then
                    record.ExtendedPrice = Convert.ToDecimal(reader.GetValue(extendedPriceColumnIndex))
                End If
                If Not reader.IsDBNull(freightColumnIndex) Then
                    record.Freight = Convert.ToDecimal(reader.GetValue(freightColumnIndex))
                End If

                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(InvoicesRow)), InvoicesRow())
    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 view.</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 view.</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="InvoicesRow"/>.
    ''' </summary>
    ''' <param name="row">The <see cref="System.Data.DataRow"/> object to be mapped.</param>
    ''' <returns>A reference to the <see cref="InvoicesRow"/> object.</returns>
    Protected Overridable Function MapRow(row As DataRow) As InvoicesRow
        Dim mappedObject As InvoicesRow = New InvoicesRow()
        Dim dataTable As DataTable = row.Table
        Dim dataColumn As DataColumn
        ' Column "ShipName"
        dataColumn = dataTable.Columns("ShipName")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShipName = CType(row(dataColumn), String)
        End If
        ' Column "ShipAddress"
        dataColumn = dataTable.Columns("ShipAddress")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShipAddress = CType(row(dataColumn), String)
        End If
        ' Column "ShipCity"
        dataColumn = dataTable.Columns("ShipCity")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShipCity = CType(row(dataColumn), String)
        End If
        ' Column "ShipRegion"
        dataColumn = dataTable.Columns("ShipRegion")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShipRegion = CType(row(dataColumn), String)
        End If
        ' Column "ShipPostalCode"
        dataColumn = dataTable.Columns("ShipPostalCode")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShipPostalCode = CType(row(dataColumn), String)
        End If
        ' Column "ShipCountry"
        dataColumn = dataTable.Columns("ShipCountry")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShipCountry = CType(row(dataColumn), String)
        End If
        ' Column "CustomerID"
        dataColumn = dataTable.Columns("CustomerID")
        If Not row.IsNull(dataColumn) Then
            mappedObject.CustomerID = CType(row(dataColumn), String)
        End If
        ' Column "CustomerName"
        dataColumn = dataTable.Columns("CustomerName")
        If Not row.IsNull(dataColumn) Then
            mappedObject.CustomerName = CType(row(dataColumn), String)
        End If
        ' Column "Address"
        dataColumn = dataTable.Columns("Address")
        If Not row.IsNull(dataColumn) Then
            mappedObject.Address = CType(row(dataColumn), String)
        End If
        ' Column "City"
        dataColumn = dataTable.Columns("City")
        If Not row.IsNull(dataColumn) Then
            mappedObject.City = CType(row(dataColumn), String)
        End If
        ' Column "Region"
        dataColumn = dataTable.Columns("Region")
        If Not row.IsNull(dataColumn) Then
            mappedObject.Region = CType(row(dataColumn), String)
        End If
        ' Column "PostalCode"
        dataColumn = dataTable.Columns("PostalCode")
        If Not row.IsNull(dataColumn) Then
            mappedObject.PostalCode = CType(row(dataColumn), String)
        End If
        ' Column "Country"
        dataColumn = dataTable.Columns("Country")
        If Not row.IsNull(dataColumn) Then
            mappedObject.Country = CType(row(dataColumn), String)
        End If
        ' Column "Salesperson"
        dataColumn = dataTable.Columns("Salesperson")
        If Not row.IsNull(dataColumn) Then
            mappedObject.Salesperson = CType(row(dataColumn), String)
        End If
        ' Column "OrderID"
        dataColumn = dataTable.Columns("OrderID")
        If Not row.IsNull(dataColumn) Then
            mappedObject.OrderID = CType(row(dataColumn), Integer)
        End If
        ' Column "OrderDate"
        dataColumn = dataTable.Columns("OrderDate")
        If Not row.IsNull(dataColumn) Then
            mappedObject.OrderDate = CType(row(dataColumn), Date)
        End If
        ' Column "RequiredDate"
        dataColumn = dataTable.Columns("RequiredDate")
        If Not row.IsNull(dataColumn) Then
            mappedObject.RequiredDate = CType(row(dataColumn), Date)
        End If
        ' Column "ShippedDate"
        dataColumn = dataTable.Columns("ShippedDate")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShippedDate = CType(row(dataColumn), Date)
        End If
        ' Column "ShipperName"
        dataColumn = dataTable.Columns("ShipperName")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ShipperName = CType(row(dataColumn), String)
        End If
        ' Column "ProductID"
        dataColumn = dataTable.Columns("ProductID")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ProductID = CType(row(dataColumn), Integer)
        End If
        ' Column "ProductName"
        dataColumn = dataTable.Columns("ProductName")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ProductName = CType(row(dataColumn), String)
        End If
        ' Column "UnitPrice"
        dataColumn = dataTable.Columns("UnitPrice")
        If Not row.IsNull(dataColumn) Then
            mappedObject.UnitPrice = CType(row(dataColumn), Decimal)
        End If
        ' Column "Quantity"
        dataColumn = dataTable.Columns("Quantity")
        If Not row.IsNull(dataColumn) Then
            mappedObject.Quantity = CType(row(dataColumn), Short)
        End If
        ' Column "Discount"
        dataColumn = dataTable.Columns("Discount")
        If Not row.IsNull(dataColumn) Then
            mappedObject.Discount = CType(row(dataColumn), Single)
        End If
        ' Column "ExtendedPrice"
        dataColumn = dataTable.Columns("ExtendedPrice")
        If Not row.IsNull(dataColumn) Then
            mappedObject.ExtendedPrice = CType(row(dataColumn), Decimal)
        End If
        ' Column "Freight"
        dataColumn = dataTable.Columns("Freight")
        If Not row.IsNull(dataColumn) Then
            mappedObject.Freight = CType(row(dataColumn), Decimal)
        End If
        Return mappedObject
    End Function

    ''' <summary>
    ''' Creates a <see cref="System.Data.DataTable"/> object for 
    ''' the <c>Invoices</c> view.
    ''' </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 = "Invoices"
        Dim dataColumn As DataColumn
        ' Create the "ShipName" column
        dataColumn = dataTable.Columns.Add("ShipName", GetType(String))
        dataColumn.MaxLength = 40
        dataColumn.ReadOnly = True
        ' Create the "ShipAddress" column
        dataColumn = dataTable.Columns.Add("ShipAddress", GetType(String))
        dataColumn.MaxLength = 60
        dataColumn.ReadOnly = True
        ' Create the "ShipCity" column
        dataColumn = dataTable.Columns.Add("ShipCity", GetType(String))
        dataColumn.MaxLength = 15
        dataColumn.ReadOnly = True
        ' Create the "ShipRegion" column
        dataColumn = dataTable.Columns.Add("ShipRegion", GetType(String))
        dataColumn.MaxLength = 15
        dataColumn.ReadOnly = True
        ' Create the "ShipPostalCode" column
        dataColumn = dataTable.Columns.Add("ShipPostalCode", GetType(String))
        dataColumn.MaxLength = 10
        dataColumn.ReadOnly = True
        ' Create the "ShipCountry" column
        dataColumn = dataTable.Columns.Add("ShipCountry", GetType(String))
        dataColumn.MaxLength = 15
        dataColumn.ReadOnly = True
        ' Create the "CustomerID" column
        dataColumn = dataTable.Columns.Add("CustomerID", GetType(String))
        dataColumn.MaxLength = 5
        dataColumn.ReadOnly = True
        ' Create the "CustomerName" column
        dataColumn = dataTable.Columns.Add("CustomerName", GetType(String))
        dataColumn.MaxLength = 40
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "Address" column
        dataColumn = dataTable.Columns.Add("Address", GetType(String))
        dataColumn.MaxLength = 60
        dataColumn.ReadOnly = True
        ' Create the "City" column
        dataColumn = dataTable.Columns.Add("City", GetType(String))
        dataColumn.MaxLength = 15
        dataColumn.ReadOnly = True
        ' Create the "Region" column
        dataColumn = dataTable.Columns.Add("Region", GetType(String))
        dataColumn.MaxLength = 15
        dataColumn.ReadOnly = True
        ' Create the "PostalCode" column
        dataColumn = dataTable.Columns.Add("PostalCode", GetType(String))
        dataColumn.MaxLength = 10
        dataColumn.ReadOnly = True
        ' Create the "Country" column
        dataColumn = dataTable.Columns.Add("Country", GetType(String))
        dataColumn.MaxLength = 15
        dataColumn.ReadOnly = True
        ' Create the "Salesperson" column
        dataColumn = dataTable.Columns.Add("Salesperson", GetType(String))
        dataColumn.MaxLength = 31
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "OrderID" column
        dataColumn = dataTable.Columns.Add("OrderID", GetType(Integer))
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "OrderDate" column
        dataColumn = dataTable.Columns.Add("OrderDate", GetType(Date))
        dataColumn.ReadOnly = True
        ' Create the "RequiredDate" column
        dataColumn = dataTable.Columns.Add("RequiredDate", GetType(Date))
        dataColumn.ReadOnly = True
        ' Create the "ShippedDate" column
        dataColumn = dataTable.Columns.Add("ShippedDate", GetType(Date))
        dataColumn.ReadOnly = True
        ' Create the "ShipperName" column
        dataColumn = dataTable.Columns.Add("ShipperName", GetType(String))
        dataColumn.MaxLength = 40
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "ProductID" column
        dataColumn = dataTable.Columns.Add("ProductID", GetType(Integer))
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "ProductName" column
        dataColumn = dataTable.Columns.Add("ProductName", GetType(String))
        dataColumn.MaxLength = 40
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "UnitPrice" column
        dataColumn = dataTable.Columns.Add("UnitPrice", GetType(Decimal))
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "Quantity" column
        dataColumn = dataTable.Columns.Add("Quantity", GetType(Short))
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "Discount" column
        dataColumn = dataTable.Columns.Add("Discount", GetType(Single))
        dataColumn.AllowDBNull = False
        dataColumn.ReadOnly = True
        ' Create the "ExtendedPrice" column
        dataColumn = dataTable.Columns.Add("ExtendedPrice", GetType(Decimal))
        dataColumn.ReadOnly = True
        ' Crea