// <fileinfo name="InvoicesCollection_Base.cs">
//      <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>

using System;
using System.Data;

namespace MyCompany.MyProject.Db
{
    /// <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 abstract class InvoicesCollection_Base
    {
        // Constants
        public const string ShipNameColumnName = "ShipName";
        public const string ShipAddressColumnName = "ShipAddress";
        public const string ShipCityColumnName = "ShipCity";
        public const string ShipRegionColumnName = "ShipRegion";
        public const string ShipPostalCodeColumnName = "ShipPostalCode";
        public const string ShipCountryColumnName = "ShipCountry";
        public const string CustomerIDColumnName = "CustomerID";
        public const string CustomerNameColumnName = "CustomerName";
        public const string AddressColumnName = "Address";
        public const string CityColumnName = "City";
        public const string RegionColumnName = "Region";
        public const string PostalCodeColumnName = "PostalCode";
        public const string CountryColumnName = "Country";
        public const string SalespersonColumnName = "Salesperson";
        public const string OrderIDColumnName = "OrderID";
        public const string OrderDateColumnName = "OrderDate";
        public const string RequiredDateColumnName = "RequiredDate";
        public const string ShippedDateColumnName = "ShippedDate";
        public const string ShipperNameColumnName = "ShipperName";
        public const string ProductIDColumnName = "ProductID";
        public const string ProductNameColumnName = "ProductName";
        public const string UnitPriceColumnName = "UnitPrice";
        public const string QuantityColumnName = "Quantity";
        public const string DiscountColumnName = "Discount";
        public const string ExtendedPriceColumnName = "ExtendedPrice";
        public const string FreightColumnName = "Freight";

        // Instance fields
        private Northwind _db;

        /// <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 InvoicesCollection_Base(Northwind db)
        {
            _db = db;
        }

        /// <summary>
        /// Gets the database object that this view belongs to.
        /// </summary>
        /// <value>The <see cref="Northwind"/> object.</value>
        protected Northwind Database
        {
            get { return _db; }
        }

        /// <summary>
        /// Gets an array of all records from the <c>Invoices</c> view.
        /// </summary>
        /// <returns>An array of <see cref="InvoicesRow"/> objects.</returns>
        public virtual InvoicesRow[] GetAll()
        {
            return MapRecords(CreateGetAllCommand());
        }

        /// <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 virtual DataTable GetAllAsDataTable()
        {
            return MapRecordsToDataTable(CreateGetAllCommand());
        }

        /// <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 virtual IDbCommand CreateGetAllCommand()
        {
            return _db.CreateCommand("dbo._Invoices_GetAll", true);
        }

        /// <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 InvoicesRow GetRow(string whereSql)
        {
            int totalRecordCount = -1;
            InvoicesRow[] rows = GetAsArray(whereSql, null, 0, 1, ref totalRecordCount);
            return 0 == rows.Length ? null : rows[0];
        }

        /// <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 InvoicesRow[] GetAsArray(string whereSql, string orderBySql)
        {
            int totalRecordCount = -1;
            return GetAsArray(whereSql, orderBySql, 0, int.MaxValue, ref totalRecordCount);
        }

        /// <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 virtual InvoicesRow[] GetAsArray(string whereSql, string orderBySql,
                            int startIndex, int length, ref int totalRecordCount)
        {
            using(IDataReader reader = _db.ExecuteReader(CreateGetCommand(whereSql, orderBySql)))
            {
                return MapRecords(reader, startIndex, length, ref totalRecordCount);
            }
        }

        /// <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 DataTable GetAsDataTable(string whereSql, string orderBySql)
        {
            int totalRecordCount = -1;
            return GetAsDataTable(whereSql, orderBySql, 0, int.MaxValue, ref totalRecordCount);
        }

        /// <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 virtual DataTable GetAsDataTable(string whereSql, string orderBySql,
                            int startIndex, int length, ref int totalRecordCount)
        {
            using(IDataReader reader = _db.ExecuteReader(CreateGetCommand(whereSql, orderBySql)))
            {
                return MapRecordsToDataTable(reader, startIndex, length, ref totalRecordCount);
            }
        }

        /// <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 virtual IDbCommand CreateGetCommand(string whereSql, string orderBySql)
        {
            string sql = "SELECT * FROM [dbo].[Invoices]";
            if(null != whereSql && 0 < whereSql.Length)
                sql += " WHERE " + whereSql;
            if(null != orderBySql && 0 < orderBySql.Length)
                sql += " ORDER BY " + orderBySql;
            return _db.CreateCommand(sql);
        }

        /// <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 InvoicesRow[] MapRecords(IDbCommand command)
        {
            using(IDataReader reader = _db.ExecuteReader(command))
            {
                return MapRecords(reader);
            }
        }

        /// <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 InvoicesRow[] MapRecords(IDataReader reader)
        {
            int totalRecordCount = -1;
            return MapRecords(reader, 0, int.MaxValue, ref totalRecordCount);
        }

        /// <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 virtual InvoicesRow[] MapRecords(IDataReader reader, 
                                        int startIndex, int length, ref int totalRecordCount)
        {
            if(0 > startIndex)
                throw new ArgumentOutOfRangeException("startIndex", startIndex, "StartIndex cannot be less than zero.");
            if(0 > length)
                throw new ArgumentOutOfRangeException("length", length, "Length cannot be less than zero.");

            int shipNameColumnIndex = reader.GetOrdinal("ShipName");
            int shipAddressColumnIndex = reader.GetOrdinal("ShipAddress");
            int shipCityColumnIndex = reader.GetOrdinal("ShipCity");
            int shipRegionColumnIndex = reader.GetOrdinal("ShipRegion");
            int shipPostalCodeColumnIndex = reader.GetOrdinal("ShipPostalCode");
            int shipCountryColumnIndex = reader.GetOrdinal("ShipCountry");
            int customerIDColumnIndex = reader.GetOrdinal("CustomerID");
            int customerNameColumnIndex = reader.GetOrdinal("CustomerName");
            int addressColumnIndex = reader.GetOrdinal("Address");
            int cityColumnIndex = reader.GetOrdinal("City");
            int regionColumnIndex = reader.GetOrdinal("Region");
            int postalCodeColumnIndex = reader.GetOrdinal("PostalCode");
            int countryColumnIndex = reader.GetOrdinal("Country");
            int salespersonColumnIndex = reader.GetOrdinal("Salesperson");
            int orderIDColumnIndex = reader.GetOrdinal("OrderID");
            int orderDateColumnIndex = reader.GetOrdinal("OrderDate");
            int requiredDateColumnIndex = reader.GetOrdinal("RequiredDate");
            int shippedDateColumnIndex = reader.GetOrdinal("ShippedDate");
            int shipperNameColumnIndex = reader.GetOrdinal("ShipperName");
            int productIDColumnIndex = reader.GetOrdinal("ProductID");
            int productNameColumnIndex = reader.GetOrdinal("ProductName");
            int unitPriceColumnIndex = reader.GetOrdinal("UnitPrice");
            int quantityColumnIndex = reader.GetOrdinal("Quantity");
            int discountColumnIndex = reader.GetOrdinal("Discount");
            int extendedPriceColumnIndex = reader.GetOrdinal("ExtendedPrice");
            int freightColumnIndex = reader.GetOrdinal("Freight");

            System.Collections.ArrayList recordList = new System.Collections.ArrayList();
            int ri = -startIndex;
            while(reader.Read())
            {
                ri++;
                if(ri > 0 && ri <= length)
                {
                    InvoicesRow record = new InvoicesRow();
                    recordList.Add(record);

                    if(!reader.IsDBNull(shipNameColumnIndex))
                        record.ShipName = Convert.ToString(reader.GetValue(shipNameColumnIndex));
                    if(!reader.IsDBNull(shipAddressColumnIndex))
                        record.ShipAddress = Convert.ToString(reader.GetValue(shipAddressColumnIndex));
                    if(!reader.IsDBNull(shipCityColumnIndex))
                        record.ShipCity = Convert.ToString(reader.GetValue(shipCityColumnIndex));
                    if(!reader.IsDBNull(shipRegionColumnIndex))
                        record.ShipRegion = Convert.ToString(reader.GetValue(shipRegionColumnIndex));
                    if(!reader.IsDBNull(shipPostalCodeColumnIndex))
                        record.ShipPostalCode = Convert.ToString(reader.GetValue(shipPostalCodeColumnIndex));
                    if(!reader.IsDBNull(shipCountryColumnIndex))
                        record.ShipCountry = Convert.ToString(reader.GetValue(shipCountryColumnIndex));
                    if(!reader.IsDBNull(customerIDColumnIndex))
                        record.CustomerID = Convert.ToString(reader.GetValue(customerIDColumnIndex));
                    record.CustomerName = Convert.ToString(reader.GetValue(customerNameColumnIndex));
                    if(!reader.IsDBNull(addressColumnIndex))
                        record.Address = Convert.ToString(reader.GetValue(addressColumnIndex));
                    if(!reader.IsDBNull(cityColumnIndex))
                        record.City = Convert.ToString(reader.GetValue(cityColumnIndex));
                    if(!reader.IsDBNull(regionColumnIndex))
                        record.Region = Convert.ToString(reader.GetValue(regionColumnIndex));
                    if(!reader.IsDBNull(postalCodeColumnIndex))
                        record.PostalCode = Convert.ToString(reader.GetValue(postalCodeColumnIndex));
                    if(!reader.IsDBNull(countryColumnIndex))
                        record.Country = Convert.ToString(reader.GetValue(countryColumnIndex));
                    record.Salesperson = Convert.ToString(reader.GetValue(salespersonColumnIndex));
                    record.OrderID = Convert.ToInt32(reader.GetValue(orderIDColumnIndex));
                    if(!reader.IsDBNull(orderDateColumnIndex))
                        record.OrderDate = Convert.ToDateTime(reader.GetValue(orderDateColumnIndex));
                    if(!reader.IsDBNull(requiredDateColumnIndex))
                        record.RequiredDate = Convert.ToDateTime(reader.GetValue(requiredDateColumnIndex));
                    if(!reader.IsDBNull(shippedDateColumnIndex))
                        record.ShippedDate = Convert.ToDateTime(reader.GetValue(shippedDateColumnIndex));
                    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(!reader.IsDBNull(extendedPriceColumnIndex))
                        record.ExtendedPrice = Convert.ToDecimal(reader.GetValue(extendedPriceColumnIndex));
                    if(!reader.IsDBNull(freightColumnIndex))
                        record.Freight = Convert.ToDecimal(reader.GetValue(freightColumnIndex));

                    if(ri == length && 0 != totalRecordCount)
                        break;
                }
            }

            totalRecordCount = 0 == totalRecordCount ? ri + startIndex : -1;
            return (InvoicesRow[])(recordList.ToArray(typeof(InvoicesRow)));
        }

        /// <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 DataTable MapRecordsToDataTable(IDbCommand command)
        {
            using(IDataReader reader = _db.ExecuteReader(command))
            {
                return MapRecordsToDataTable(reader);
            }
        }

        /// <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 DataTable MapRecordsToDataTable(IDataReader reader)
        {
            int totalRecordCount = 0;
            return MapRecordsToDataTable(reader, 0, int.MaxValue, ref totalRecordCount);
        }
        
        /// <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 virtual DataTable MapRecordsToDataTable(IDataReader reader, 
                                        int startIndex, int length, ref int totalRecordCount)
        {
            if(0 > startIndex)
                throw new ArgumentOutOfRangeException("startIndex", startIndex, "StartIndex cannot be less than zero.");
            if(0 > length)
                throw new ArgumentOutOfRangeException("length", length, "Length cannot be less than zero.");

            int columnCount = reader.FieldCount;
            int ri = -startIndex;
            
            DataTable dataTable = CreateDataTable();
            dataTable.BeginLoadData();
            object[] values = new object[columnCount];

            while(reader.Read())
            {
                ri++;
                if(ri > 0 && ri <= length)
                {
                    reader.GetValues(values);
                    dataTable.LoadDataRow(values, true);

                    if(ri == length && 0 != totalRecordCount)
                        break;
                }
            }
            dataTable.EndLoadData();

            totalRecordCount = 0 == totalRecordCount ? ri + startIndex : -1;
            return dataTable;
        }

        /// <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 virtual InvoicesRow MapRow(DataRow row)
        {
            InvoicesRow mappedObject = new InvoicesRow();
            DataTable dataTable = row.Table;
            DataColumn dataColumn;
            // Column "ShipName"
            dataColumn = dataTable.Columns["ShipName"];
            if(!row.IsNull(dataColumn))
                mappedObject.ShipName = (string)row[dataColumn];
            // Column "ShipAddress"
            dataColumn = dataTable.Columns["ShipAddress"];
            if(!row.IsNull(dataColumn))
                mappedObject.ShipAddress = (string)row[dataColumn];
            // Column "ShipCity"
            dataColumn = dataTable.Columns["ShipCity"];
            if(!row.IsNull(dataColumn))
                mappedObject.ShipCity = (string)row[dataColumn];
            // Column "ShipRegion"
            dataColumn = dataTable.Columns["ShipRegion"];
            if(!row.IsNull(dataColumn))
                mappedObject.ShipRegion = (string)row[dataColumn];
            // Column "ShipPostalCode"
            dataColumn = dataTable.Columns["ShipPostalCode"];
            if(!row.IsNull(dataColumn))
                mappedObject.ShipPostalCode = (string)row[dataColumn];
            // Column "ShipCountry"
            dataColumn = dataTable.Columns["ShipCountry"];
            if(!row.IsNull(dataColumn))
                mappedObject.ShipCountry = (string)row[dataColumn];
            // Column "CustomerID"
            dataColumn = dataTable.Columns["CustomerID"];
            if(!row.IsNull(dataColumn))
                mappedObject.CustomerID = (string)row[dataColumn];
            // Column "CustomerName"
            dataColumn = dataTable.Columns["CustomerName"];
            if(!row.IsNull(dataColumn))
                mappedObject.CustomerName = (string)row[dataColumn];
            // Column "Address"
            dataColumn = dataTable.Columns["Address"];
            if(!row.IsNull(dataColumn))
                mappedObject.Address = (string)row[dataColumn];
            // Column "City"
            dataColumn = dataTable.Columns["City"];
            if(!row.IsNull(dataColumn))
                mappedObject.City = (string)row[dataColumn];
            // Column "Region"
            dataColumn = dataTable.Columns["Region"];
            if(!row.IsNull(dataColumn))
                mappedObject.Region = (string)row[dataColumn];
            // Column "PostalCode"
            dataColumn = dataTable.Columns["PostalCode"];
            if(!row.IsNull(dataColumn))
                mappedObject.PostalCode = (string)row[dataColumn];
            // Column "Country"
            dataColumn = dataTable.Columns["Country"];
            if(!row.IsNull(dataColumn))
                mappedObject.Country = (string)row[dataColumn];
            // Column "Salesperson"
            dataColumn = dataTable.Columns["Salesperson"];
            if(!row.IsNull(dataColumn))
                mappedObject.Salesperson = (string)row[dataColumn];
            // Column "OrderID"
            dataColumn = dataTable.Columns["OrderID"];
            if(!row.IsNull(dataColumn))
                mappedObject.OrderID = (int)row[dataColumn];
            // Column "OrderDate"
            dataColumn = dataTable.Columns["OrderDate"];
            if(!row.IsNull(dataColumn))
                mappedObject.OrderDate = (System.DateTime)