/// <summary>
        /// Gets a product specification attribute mapping collection
        /// </summary>
        /// <param name="ProductID">Product identifier</param>
        /// <param name="AllowFiltering">0 to load attributes with AllowFiltering set to false, 0 to load attributes with AllowFiltering set to true, null to load all attributes</param>
        /// <param name="ShowOnProductPage">0 to load attributes with ShowOnProductPage set to false, 0 to load attributes with ShowOnProductPage set to true, null to load all attributes</param>
        /// <returns>Product specification attribute mapping collection</returns>
        public override DBProductSpecificationAttributeCollection GetProductSpecificationAttributesByProductID(int ProductID, bool?AllowFiltering, bool?ShowOnProductPage)
        {
            DBProductSpecificationAttributeCollection productSpecificationAttributes = new DBProductSpecificationAttributeCollection();
            Database  db        = NopSqlDataHelper.CreateConnection(_sqlConnectionString);
            DbCommand dbCommand = db.GetStoredProcCommand("Nop_Product_SpecificationAttribute_MappingLoadByProductID");

            db.AddInParameter(dbCommand, "ProductID", DbType.Int32, ProductID);
            if (AllowFiltering.HasValue)
            {
                db.AddInParameter(dbCommand, "AllowFiltering", DbType.Boolean, AllowFiltering.Value);
            }
            else
            {
                db.AddInParameter(dbCommand, "AllowFiltering", DbType.Boolean, null);
            }
            if (ShowOnProductPage.HasValue)
            {
                db.AddInParameter(dbCommand, "ShowOnProductPage", DbType.Boolean, ShowOnProductPage.Value);
            }
            else
            {
                db.AddInParameter(dbCommand, "ShowOnProductPage", DbType.Boolean, null);
            }
            using (IDataReader dataReader = db.ExecuteReader(dbCommand))
            {
                while (dataReader.Read())
                {
                    DBProductSpecificationAttribute productSpecificationAttribute = GetProductSpecificationAttributeFromReader(dataReader);
                    productSpecificationAttributes.Add(productSpecificationAttribute);
                }
            }

            return(productSpecificationAttributes);
        }
        /// <summary>
        /// Maps a data reader to a product specification attribute
        /// </summary>
        /// <param name="dataReader">IDataReader</param>
        /// <returns>Product specification attribute</returns>
        private DBProductSpecificationAttribute GetProductSpecificationAttributeFromReader(IDataReader dataReader)
        {
            var item = new DBProductSpecificationAttribute();

            item.ProductSpecificationAttributeId = NopSqlDataHelper.GetInt(dataReader, "ProductSpecificationAttributeID");
            item.ProductId = NopSqlDataHelper.GetInt(dataReader, "ProductID");
            item.SpecificationAttributeOptionId = NopSqlDataHelper.GetInt(dataReader, "SpecificationAttributeOptionID");
            item.AllowFiltering    = NopSqlDataHelper.GetBoolean(dataReader, "AllowFiltering");
            item.ShowOnProductPage = NopSqlDataHelper.GetBoolean(dataReader, "ShowOnProductPage");
            item.DisplayOrder      = NopSqlDataHelper.GetInt(dataReader, "DisplayOrder");
            return(item);
        }
        /// <summary>
        /// Updates the product specification attribute mapping
        /// </summary>
        /// <param name="productSpecificationAttributeId">product specification attribute mapping identifier</param>
        /// <param name="productId">Product identifier</param>
        /// <param name="specificationAttributeOptionId">Specification attribute option identifier</param>
        /// <param name="allowFiltering">Allow product filtering by this attribute</param>
        /// <param name="showOnProductPage">Show the attribute onn the product page</param>
        /// <param name="displayOrder">The display order</param>
        /// <returns>Product specification attribute mapping</returns>
        public override DBProductSpecificationAttribute UpdateProductSpecificationAttribute(int productSpecificationAttributeId,
                                                                                            int productId, int specificationAttributeOptionId, bool allowFiltering, bool showOnProductPage, int displayOrder)
        {
            DBProductSpecificationAttribute item = null;
            Database  db        = NopSqlDataHelper.CreateConnection(_sqlConnectionString);
            DbCommand dbCommand = db.GetStoredProcCommand("Nop_Product_SpecificationAttribute_MappingUpdate");

            db.AddInParameter(dbCommand, "ProductSpecificationAttributeID", DbType.Int32, productSpecificationAttributeId);
            db.AddInParameter(dbCommand, "ProductID", DbType.Int32, productId);
            db.AddInParameter(dbCommand, "SpecificationAttributeOptionID", DbType.Int32, specificationAttributeOptionId);
            db.AddInParameter(dbCommand, "AllowFiltering", DbType.Boolean, allowFiltering);
            db.AddInParameter(dbCommand, "ShowOnProductPage", DbType.Boolean, showOnProductPage);
            db.AddInParameter(dbCommand, "DisplayOrder", DbType.Int32, displayOrder);
            if (db.ExecuteNonQuery(dbCommand) > 0)
            {
                item = GetProductSpecificationAttributeById(productSpecificationAttributeId);
            }

            return(item);
        }
        /// <summary>
        /// Inserts a product specification attribute mapping
        /// </summary>
        /// <param name="productID">Product identifier</param>
        /// <param name="specificationAttributeOptionID">Specification attribute option identifier</param>
        /// <param name="allowFiltering">Allow product filtering by this attribute</param>
        /// <param name="showOnProductPage">Show the attribute on the product page</param>
        /// <param name="displayOrder">The display order</param>
        /// <returns>Product specification attribute mapping</returns>
        public override DBProductSpecificationAttribute InsertProductSpecificationAttribute(int productID, int specificationAttributeOptionID,
                                                                                            bool allowFiltering, bool showOnProductPage, int displayOrder)
        {
            DBProductSpecificationAttribute productSpecificationAttribute = null;
            Database  db        = NopSqlDataHelper.CreateConnection(_sqlConnectionString);
            DbCommand dbCommand = db.GetStoredProcCommand("Nop_Product_SpecificationAttribute_MappingInsert");

            db.AddOutParameter(dbCommand, "ProductSpecificationAttributeID", DbType.Int32, 0);
            db.AddInParameter(dbCommand, "ProductID", DbType.Int32, productID);
            db.AddInParameter(dbCommand, "SpecificationAttributeOptionID", DbType.Int32, specificationAttributeOptionID);
            db.AddInParameter(dbCommand, "AllowFiltering", DbType.Boolean, allowFiltering);
            db.AddInParameter(dbCommand, "ShowOnProductPage", DbType.Boolean, showOnProductPage);
            db.AddInParameter(dbCommand, "DisplayOrder", DbType.Int32, displayOrder);
            if (db.ExecuteNonQuery(dbCommand) > 0)
            {
                int ProductSpecificationAttributeID = Convert.ToInt32(db.GetParameterValue(dbCommand, "@ProductSpecificationAttributeID"));
                productSpecificationAttribute = GetProductSpecificationAttributeByID(ProductSpecificationAttributeID);
            }
            return(productSpecificationAttribute);
        }
        /// <summary>
        /// Gets a product specification attribute mapping
        /// </summary>
        /// <param name="productSpecificationAttributeId">Product specification attribute mapping identifier</param>
        /// <returns>Product specification attribute mapping</returns>
        public override DBProductSpecificationAttribute GetProductSpecificationAttributeById(int productSpecificationAttributeId)
        {
            DBProductSpecificationAttribute item = null;

            if (productSpecificationAttributeId == 0)
            {
                return(item);
            }
            Database  db        = NopSqlDataHelper.CreateConnection(_sqlConnectionString);
            DbCommand dbCommand = db.GetStoredProcCommand("Nop_Product_SpecificationAttribute_MappingLoadByPrimaryKey");

            db.AddInParameter(dbCommand, "ProductSpecificationAttributeID", DbType.Int32, productSpecificationAttributeId);
            using (IDataReader dataReader = db.ExecuteReader(dbCommand))
            {
                if (dataReader.Read())
                {
                    item = GetProductSpecificationAttributeFromReader(dataReader);
                }
            }
            return(item);
        }