/// <summary> Gets the collection of all (public) items in the library </summary>
        /// <param name="SinceDate"> Date from which to pull the data </param>
        /// <param name="IncludePrivateItems"> Flag indicates whether to include private items in the result set </param>
        /// <param name="ResultsPerPage"> Number of results to return per "page" of results </param>
        /// <param name="ResultsPage"> Which page of results to return ( one-based, so the first page is page number of one )</param>
        /// <param name="Sort"> Current sort to use ( 0 = default by search or browse, 1 = title, 10 = date asc, 11 = date desc )</param>
        /// <param name="IncludeFacets"> Flag indicates if facets should be included in the final result set</param>
        /// <param name="FacetTypes"> Primary key for the metadata types to include as facets (up to eight)</param>
        /// <param name="ReturnSearchStatistics"> Flag indicates whether to create and return statistics about the overall search results, generally set to TRUE for the first page requested and subsequently set to FALSE </param>
        /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering</param>
        /// <returns> Table with all of the item and item group information </returns>
        /// <remarks> This calls the 'SobekCM_Get_All_Browse_Paged2' stored procedure </remarks>
        public static Multiple_Paged_Results_Args Get_All_Browse_Paged(string SinceDate, bool IncludePrivateItems, int ResultsPerPage, int ResultsPage, int Sort, bool IncludeFacets, List<short> FacetTypes, bool ReturnSearchStatistics, Custom_Tracer Tracer)
        {
            if (Tracer != null)
            {
                Tracer.Add_Trace("Engine_Database.Get_All_Browse_Paged", "Pulling browse from database");
            }

            // Create the parameter list
            List<EalDbParameter> parameters = new List<EalDbParameter>
            {
                SinceDate.Length > 0 ? new EalDbParameter("@date", SinceDate) : new EalDbParameter("@date", DBNull.Value),
                new EalDbParameter("@include_private", IncludePrivateItems),
                new EalDbParameter("@pagesize", ResultsPerPage),
                new EalDbParameter("@pagenumber", ResultsPage),
                new EalDbParameter("@sort", Sort),
                new EalDbParameter("@minpagelookahead", MIN_PAGE_LOOKAHEAD),
                new EalDbParameter("@maxpagelookahead", MAX_PAGE_LOOKAHEAD),
                new EalDbParameter("@lookahead_factor", LOOKAHEAD_FACTOR),
                new EalDbParameter("@include_facets", IncludeFacets)
            };
            if ((IncludeFacets) && (FacetTypes != null))
            {
                parameters.Add(FacetTypes.Count > 0 ? new EalDbParameter("@facettype1", FacetTypes[0]) : new EalDbParameter("@facettype1", -1));
                parameters.Add(FacetTypes.Count > 1 ? new EalDbParameter("@facettype2", FacetTypes[1]) : new EalDbParameter("@facettype2", -1));
                parameters.Add(FacetTypes.Count > 2 ? new EalDbParameter("@facettype3", FacetTypes[2]) : new EalDbParameter("@facettype3", -1));
                parameters.Add(FacetTypes.Count > 3 ? new EalDbParameter("@facettype4", FacetTypes[3]) : new EalDbParameter("@facettype4", -1));
                parameters.Add(FacetTypes.Count > 4 ? new EalDbParameter("@facettype5", FacetTypes[4]) : new EalDbParameter("@facettype5", -1));
                parameters.Add(FacetTypes.Count > 5 ? new EalDbParameter("@facettype6", FacetTypes[5]) : new EalDbParameter("@facettype6", -1));
                parameters.Add(FacetTypes.Count > 6 ? new EalDbParameter("@facettype7", FacetTypes[6]) : new EalDbParameter("@facettype7", -1));
                parameters.Add(FacetTypes.Count > 7 ? new EalDbParameter("@facettype8", FacetTypes[7]) : new EalDbParameter("@facettype8", -1));
            }
            else
            {
                parameters.Add(new EalDbParameter("@facettype1", -1));
                parameters.Add(new EalDbParameter("@facettype2", -1));
                parameters.Add(new EalDbParameter("@facettype3", -1));
                parameters.Add(new EalDbParameter("@facettype4", -1));
                parameters.Add(new EalDbParameter("@facettype5", -1));
                parameters.Add(new EalDbParameter("@facettype6", -1));
                parameters.Add(new EalDbParameter("@facettype7", -1));
                parameters.Add(new EalDbParameter("@facettype8", -1));
            }
            parameters.Add(new EalDbParameter("@item_count_to_use_cached", 1000));

            // Add parameters for total items and total titles
            EalDbParameter totalItemsParameter = new EalDbParameter("@total_items", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(totalItemsParameter);

            EalDbParameter totalTitlesParameter = new EalDbParameter("@total_titles", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(totalTitlesParameter);

            Multiple_Paged_Results_Args returnArgs;
            try
            {

                // Create the database agnostic reader
                EalDbReaderWrapper readerWrapper = EalDbAccess.ExecuteDataReader(DatabaseType, Connection_String + ";Connection Timeout=45", CommandType.StoredProcedure, "SobekCM_Get_All_Browse_Paged2", parameters);

                // Pull out the database reader
                DbDataReader reader = readerWrapper.Reader;

                // Create the return argument object
                List<string> metadataLabels = new List<string>();
                returnArgs = new Multiple_Paged_Results_Args
                {
                    Paged_Results = DataReader_To_Result_List_With_LookAhead2(reader, ResultsPerPage, metadataLabels)
                };

                // Create the overall search statistics?
                if (ReturnSearchStatistics)
                {
                    Search_Results_Statistics stats = new Search_Results_Statistics(reader, FacetTypes, metadataLabels);
                    returnArgs.Statistics = stats;
                    readerWrapper.Close();
                    stats.Total_Items = Convert.ToInt32(totalItemsParameter.Value);
                    stats.Total_Titles = Convert.ToInt32(totalTitlesParameter.Value);
                }
                else
                {
                    // Close the reader (which also closes the connection)
                    readerWrapper.Close();
                }
            }
            catch (Exception ee)
            {
                Last_Exception = ee;
                if (Tracer != null)
                {
                    Tracer.Add_Trace("Engine_Database.Get_All_Browse_Paged", "Exception caught during database work", Custom_Trace_Type_Enum.Error);
                    Tracer.Add_Trace("Engine_Database.Get_All_Browse_Paged", ee.Message, Custom_Trace_Type_Enum.Error);
                    Tracer.Add_Trace("Engine_Database.Get_All_Browse_Paged", ee.StackTrace, Custom_Trace_Type_Enum.Error);
                }
                throw;
            }

            // Return the built result arguments
            return returnArgs;
        }
        /// <summary> Returns the list of all items/titles which match a given OCLC number </summary>
        /// <param name="OclcNumber"> OCLC number to look for matching items </param>
        /// <param name="IncludePrivateItems"> Flag indicates whether to include private items in the result set </param>
        /// <param name="ResultsPerPage"> Number of results to return per "page" of results </param>
        /// <param name="Sort"> Current sort to use ( 0 = default by search or browse, 1 = title, 10 = date asc, 11 = date desc )</param>
        /// <param name="ReturnSearchStatistics"> Flag indicates whether to create and return statistics about the overall search results, generally set to TRUE for the first page requested and subsequently set to FALSE </param>
        /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering</param>
        /// <returns> Table with all of the item and item group information which matches the OCLC number </returns>
        /// <remarks> This calls the 'SobekCM_Items_By_OCLC' stored procedure </remarks>
        public static Multiple_Paged_Results_Args Items_By_OCLC_Number(long OclcNumber, bool IncludePrivateItems, int ResultsPerPage, int Sort, bool ReturnSearchStatistics, Custom_Tracer Tracer)
        {
            if (Tracer != null)
            {
                Tracer.Add_Trace("Engine_Database.Items_By_OCLC_Number", "Searching by OCLC in the database");
            }

            // Build the parameter list
            EalDbParameter[] paramList = new EalDbParameter[5];
            paramList[0] = new EalDbParameter("@oclc_number", OclcNumber);
            paramList[1] = new EalDbParameter("@include_private", IncludePrivateItems);
            paramList[2] = new EalDbParameter("@sort", Sort);
            paramList[3] = new EalDbParameter("@total_items", 0) {Direction = ParameterDirection.InputOutput};
            paramList[4] = new EalDbParameter("@total_titles", 0) {Direction = ParameterDirection.InputOutput};

            // Create the database agnostic reader
            EalDbReaderWrapper readerWrapper = EalDbAccess.ExecuteDataReader(DatabaseType, Connection_String, CommandType.StoredProcedure, "SobekCM_Items_By_OCLC", paramList);

            // Pull out the database reader
            DbDataReader reader = readerWrapper.Reader;

            // Create the return argument object
            List<string> metadataFields = new List<string>();
            Multiple_Paged_Results_Args returnArgs = new Multiple_Paged_Results_Args
            {
                Paged_Results = DataReader_To_Result_List_With_LookAhead2(reader, ResultsPerPage, metadataFields)
            };

            // Create the overall search statistics?
            if (ReturnSearchStatistics)
            {
                Search_Results_Statistics stats = new Search_Results_Statistics(reader, null, metadataFields);
                returnArgs.Statistics = stats;
                readerWrapper.Close();
                stats.Total_Items = Convert.ToInt32(paramList[3].Value);
                stats.Total_Titles = Convert.ToInt32(paramList[4].Value);
            }
            else
            {
                // Close the reader (which also closes the connection)
                readerWrapper.Close();
            }

            // Return the built results
            return returnArgs;
        }
        /// <summary> Performs a basic metadata search over the entire citation, given a search condition, and returns one page of results </summary>
        /// <param name="SearchCondition"> Search condition string to be run against the databasse </param>
        /// <param name="IncludePrivateItems"> Flag indicates whether to include private items in the result set </param>
        /// <param name="AggregationCode"> Code for the aggregation of interest ( or empty string to search all aggregationPermissions )</param>
        /// <param name="DateRangeStart"> If this search includes a date range search, start of the date range, or -1</param>
        /// <param name="DateRangeEnd"> If this search includes a date range search, end of the date range, or -1</param>
        /// <param name="ResultsPerPage"> Number of results to return per "page" of results </param>
        /// <param name="ResultsPage"> Which page of results to return ( one-based, so the first page is page number of one )</param>
        /// <param name="Sort"> Current sort to use ( 0 = default by search or browse, 1 = title, 10 = date asc, 11 = date desc )</param>
        /// <param name="IncludeFacets"> Flag indicates whether to include facets in the result set </param>
        /// <param name="FacetTypes"> Primary key for the metadata types to include as facets (up to eight)</param>
        /// <param name="ReturnSearchStatistics"> Flag indicates whether to create and return statistics about the overall search results, generally set to TRUE for the first page requested and subsequently set to FALSE </param>
        /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering</param>
        /// <returns> Small arguments object which contains the page of results and optionally statistics about results for the entire search, including complete counts and facet information </returns>
        /// <remarks> This calls the 'SobekCM_Metadata_Basic_Search_Paged' stored procedure </remarks>
        public static Multiple_Paged_Results_Args Perform_Metadata_Search_Paged(string SearchCondition, bool IncludePrivateItems, string AggregationCode, long DateRangeStart, long DateRangeEnd, int ResultsPerPage, int ResultsPage, int Sort, bool IncludeFacets, List<short> FacetTypes, bool ReturnSearchStatistics, Custom_Tracer Tracer)
        {
            if (Tracer != null)
            {
                Tracer.Add_Trace("Engine_Database.Perform_Basic_Search_Paged", "Performing basic search in database  ( stored procedure SobekCM_Metadata_Basic_Search_Paged2 )");
            }

            if (AggregationCode.ToUpper() == "ALL")
                AggregationCode = String.Empty;

            // Build the list of parameters
            List<EalDbParameter> parameters = new List<EalDbParameter>
            {
                new EalDbParameter("@searchcondition", SearchCondition.Replace("''", "'")),
                new EalDbParameter("@include_private", IncludePrivateItems),
                new EalDbParameter("@aggregationcode", AggregationCode),
                new EalDbParameter("@daterange_start", DateRangeStart),
                new EalDbParameter("@daterange_end", DateRangeEnd),
                new EalDbParameter("@pagesize", ResultsPerPage),
                new EalDbParameter("@pagenumber", ResultsPage),
                new EalDbParameter("@sort", Sort)
            };

            // If this is for more than 100 results, don't look ahead
            if (ResultsPerPage > 100)
            {
                parameters.Add(new EalDbParameter("@minpagelookahead", 1));
                parameters.Add(new EalDbParameter("@maxpagelookahead", 1));
                parameters.Add(new EalDbParameter("@lookahead_factor", LOOKAHEAD_FACTOR));
            }
            else
            {
                parameters.Add(new EalDbParameter("@minpagelookahead", MIN_PAGE_LOOKAHEAD));
                parameters.Add(new EalDbParameter("@maxpagelookahead", MAX_PAGE_LOOKAHEAD));
                parameters.Add(new EalDbParameter("@lookahead_factor", LOOKAHEAD_FACTOR));
            }

            if ((IncludeFacets) && (FacetTypes != null) && (FacetTypes.Count > 0) && (ReturnSearchStatistics))
            {
                parameters.Add(new EalDbParameter("@include_facets", true));
                parameters.Add(FacetTypes.Count > 0 ? new EalDbParameter("@facettype1", FacetTypes[0]) : new EalDbParameter("@facettype1", -1));
                parameters.Add(FacetTypes.Count > 1 ? new EalDbParameter("@facettype2", FacetTypes[1]) : new EalDbParameter("@facettype2", -1));
                parameters.Add(FacetTypes.Count > 2 ? new EalDbParameter("@facettype3", FacetTypes[2]) : new EalDbParameter("@facettype3", -1));
                parameters.Add(FacetTypes.Count > 3 ? new EalDbParameter("@facettype4", FacetTypes[3]) : new EalDbParameter("@facettype4", -1));
                parameters.Add(FacetTypes.Count > 4 ? new EalDbParameter("@facettype5", FacetTypes[4]) : new EalDbParameter("@facettype5", -1));
                parameters.Add(FacetTypes.Count > 5 ? new EalDbParameter("@facettype6", FacetTypes[5]) : new EalDbParameter("@facettype6", -1));
                parameters.Add(FacetTypes.Count > 6 ? new EalDbParameter("@facettype7", FacetTypes[6]) : new EalDbParameter("@facettype7", -1));
                parameters.Add(FacetTypes.Count > 7 ? new EalDbParameter("@facettype8", FacetTypes[7]) : new EalDbParameter("@facettype8", -1));
            }
            else
            {
                parameters.Add(new EalDbParameter("@include_facets", false));
                parameters.Add(new EalDbParameter("@facettype1", -1));
                parameters.Add(new EalDbParameter("@facettype2", -1));
                parameters.Add(new EalDbParameter("@facettype3", -1));
                parameters.Add(new EalDbParameter("@facettype4", -1));
                parameters.Add(new EalDbParameter("@facettype5", -1));
                parameters.Add(new EalDbParameter("@facettype6", -1));
                parameters.Add(new EalDbParameter("@facettype7", -1));
                parameters.Add(new EalDbParameter("@facettype8", -1));
            }

            // Add parameters for total items and total titles
            EalDbParameter totalItemsParameter = new EalDbParameter("@total_items", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(totalItemsParameter);

            EalDbParameter totalTitlesParameter = new EalDbParameter("@total_titles", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(totalTitlesParameter);

            // Add parameters for items and titles if this search is expanded to include all aggregationPermissions
            EalDbParameter expandedItemsParameter = new EalDbParameter("@all_collections_items", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(expandedItemsParameter);

            EalDbParameter expandedTitlesParameter = new EalDbParameter("@all_collections_titles", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(expandedTitlesParameter);

            // Create the database agnostic reader
            EalDbReaderWrapper readerWrapper = EalDbAccess.ExecuteDataReader(DatabaseType, Connection_String + "Connection Timeout=45", CommandType.StoredProcedure, "SobekCM_Metadata_Basic_Search_Paged2", parameters);

            // Pull out the database reader
            DbDataReader reader = readerWrapper.Reader;

            // Create the return argument object
            List<string> metadataLabels = new List<string>();
            Multiple_Paged_Results_Args returnArgs = new Multiple_Paged_Results_Args
            {
                Paged_Results = DataReader_To_Result_List_With_LookAhead2(reader, ResultsPerPage, metadataLabels)
            };

            // Create the overall search statistics?
            if (ReturnSearchStatistics)
            {
                Search_Results_Statistics stats = new Search_Results_Statistics(reader, FacetTypes, metadataLabels);
                returnArgs.Statistics = stats;
                readerWrapper.Close();
                stats.Total_Items = Convert.ToInt32(totalItemsParameter.Value);
                stats.Total_Titles = Convert.ToInt32(totalTitlesParameter.Value);
                int allItems = Convert.ToInt32(expandedItemsParameter.Value);
                int allTitles = Convert.ToInt32(expandedTitlesParameter.Value);
                if (allItems > 0) stats.All_Collections_Items = allItems;
                if (allTitles > 0) stats.All_Collections_Titles = allTitles;

                foreach (Search_Facet_Collection thisFacet in stats.Facet_Collections)
                {
                    Metadata_Search_Field field = Engine_ApplicationCache_Gateway.Settings.Metadata_Search_Field_By_ID(thisFacet.MetadataTypeID);
                    thisFacet.MetadataTerm = field.Facet_Term;
                }
            }
            else
            {
                // Close the reader (which also closes the connection)
                readerWrapper.Close();
            }

            // Return the built result arguments
            return returnArgs;
        }
        /// <summary> Performs geographic search for items within provided rectangular bounding box and linked to item aggregation of interest </summary>
        /// <param name="AggregationCode"> Code for the item aggregation of interest </param>
        /// <param name="Latitude1"> Latitudinal portion of the first point making up the rectangular bounding box</param>
        /// <param name="Longitude1"> Longitudinal portion of the first point making up the rectangular bounding box</param>
        /// <param name="Latitude2"> Latitudinal portion of the second point making up the rectangular bounding box</param>
        /// <param name="Longitude2"> Longitudinal portion of the second point making up the rectangular bounding box</param>
        /// <param name="IncludePrivateItems"> Flag indicates whether to include private items in the result set </param>
        /// <param name="ResultsPerPage"> Number of results to return per "page" of results </param>
        /// <param name="ResultsPage"> Which page of results to return ( one-based, so the first page is page number of one )</param>
        /// <param name="Sort"> Current sort to use ( 0 = default by search or browse, 1 = title, 10 = date asc, 11 = date desc )</param>
        /// <param name="IncludeFacets"> Flag indicates if facets should be included in the result set </param>
        /// <param name="FacetTypes"> Primary key for the metadata types to include as facets (up to eight)</param>
        /// <param name="ReturnSearchStatistics"> Flag indicates whether to create and return statistics about the overall search results, generally set to TRUE for the first page requested and subsequently set to FALSE </param>
        /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering</param>
        /// <returns> Table with all of the item and item group information within provided bounding box </returns>
        /// <remarks> This calls the 'SobekCM_Get_Items_By_Coordinates' stored procedure </remarks>
        public static Multiple_Paged_Results_Args Get_Items_By_Coordinates(string AggregationCode, double Latitude1, double Longitude1, double Latitude2, double Longitude2, bool IncludePrivateItems, int ResultsPerPage, int ResultsPage, int Sort, bool IncludeFacets, List<short> FacetTypes, bool ReturnSearchStatistics, Custom_Tracer Tracer)
        {
            if (Tracer != null)
            {
                Tracer.Add_Trace("Engine_Database.Get_Items_By_Coordinates", "Pulling data from database");
            }

            // Build the parameters
            List<EalDbParameter> parameters = new List<EalDbParameter>();
            parameters.Add(new EalDbParameter("@lat1", Latitude1));
            parameters.Add(new EalDbParameter("@long1", Longitude1));
            if ((Latitude1 == Latitude2) && (Longitude1 == Longitude2))
            {
                parameters.Add(new EalDbParameter("@lat2", DBNull.Value));
                parameters.Add(new EalDbParameter("@long2", DBNull.Value));
            }
            else
            {
                parameters.Add(new EalDbParameter("@lat2", Latitude2));
                parameters.Add(new EalDbParameter("@long2", Longitude2));
            }

            parameters.Add(new EalDbParameter("@include_private", IncludePrivateItems));
            parameters.Add(new EalDbParameter("@aggregationcode", AggregationCode));
            parameters.Add(new EalDbParameter("@pagesize", ResultsPerPage));
            parameters.Add(new EalDbParameter("@pagenumber", ResultsPage));
            parameters.Add(new EalDbParameter("@sort", Sort));
            parameters.Add(new EalDbParameter("@minpagelookahead", MIN_PAGE_LOOKAHEAD));
            parameters.Add(new EalDbParameter("@maxpagelookahead", MAX_PAGE_LOOKAHEAD));
            parameters.Add(new EalDbParameter("@lookahead_factor", LOOKAHEAD_FACTOR));
            parameters.Add(new EalDbParameter("@include_facets", IncludeFacets));

            if ((IncludeFacets) && (FacetTypes != null) && (ReturnSearchStatistics))
            {
                parameters.Add(FacetTypes.Count > 0 ? new EalDbParameter("@facettype1", FacetTypes[0]) : new EalDbParameter("@facettype1", -1));
                parameters.Add(FacetTypes.Count > 1 ? new EalDbParameter("@facettype2", FacetTypes[1]) : new EalDbParameter("@facettype2", -1));
                parameters.Add(FacetTypes.Count > 2 ? new EalDbParameter("@facettype3", FacetTypes[2]) : new EalDbParameter("@facettype3", -1));
                parameters.Add(FacetTypes.Count > 3 ? new EalDbParameter("@facettype4", FacetTypes[3]) : new EalDbParameter("@facettype4", -1));
                parameters.Add(FacetTypes.Count > 4 ? new EalDbParameter("@facettype5", FacetTypes[4]) : new EalDbParameter("@facettype5", -1));
                parameters.Add(FacetTypes.Count > 5 ? new EalDbParameter("@facettype6", FacetTypes[5]) : new EalDbParameter("@facettype6", -1));
                parameters.Add(FacetTypes.Count > 6 ? new EalDbParameter("@facettype7", FacetTypes[6]) : new EalDbParameter("@facettype7", -1));
                parameters.Add(FacetTypes.Count > 7 ? new EalDbParameter("@facettype8", FacetTypes[7]) : new EalDbParameter("@facettype8", -1));
            }
            else
            {
                parameters.Add(new EalDbParameter("@facettype1", -1));
                parameters.Add(new EalDbParameter("@facettype2", -1));
                parameters.Add(new EalDbParameter("@facettype3", -1));
                parameters.Add(new EalDbParameter("@facettype4", -1));
                parameters.Add(new EalDbParameter("@facettype5", -1));
                parameters.Add(new EalDbParameter("@facettype6", -1));
                parameters.Add(new EalDbParameter("@facettype7", -1));
                parameters.Add(new EalDbParameter("@facettype8", -1));
            }

            // Add parameters for total items and total titles
            EalDbParameter totalItemsParameter = new EalDbParameter("@total_items", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(totalItemsParameter);

            EalDbParameter totalTitlesParameter = new EalDbParameter("@total_titles", 0) {Direction = ParameterDirection.InputOutput};
            parameters.Add(totalTitlesParameter);

            // Create the database agnostic reader
            EalDbReaderWrapper readerWrapper = EalDbAccess.ExecuteDataReader(DatabaseType, Connection_String + "Connection Timeout=45", CommandType.StoredProcedure, "SobekCM_Get_Items_By_Coordinates", parameters);

            // Pull out the database reader
            DbDataReader reader = readerWrapper.Reader;

            List<string> metadataFields = new List<string>();
            // Create the return argument object
            Multiple_Paged_Results_Args returnArgs = new Multiple_Paged_Results_Args {Paged_Results = DataReader_To_Result_List_With_LookAhead2(reader, ResultsPerPage, metadataFields)};

            // Create the overall search statistics?
            if (ReturnSearchStatistics)
            {
                Search_Results_Statistics stats = new Search_Results_Statistics(reader, FacetTypes, metadataFields);
                returnArgs.Statistics = stats;
                readerWrapper.Close();
                stats.Total_Items = Convert.ToInt32(totalItemsParameter.Value);
                stats.Total_Titles = Convert.ToInt32(totalTitlesParameter.Value);
            }
            else
            {
                // Close the reader (which also closes the connection)
                readerWrapper.Close();
            }

            // Return the built result arguments
            return returnArgs;
        }