/// <summary>
        /// Returns all resource items for a given resource ID in all locales.
        /// Returned as full ResourceItem objects
        /// </summary>
        /// <param name="resourceId">The resource Id to return for</param>
        /// <param name="resourceSet">Resourceset to look in</param>
        /// <param name="forAllResourceSetLocales">When true returns empty entries for missing resources of locales in this resource set</param>
        /// <returns>List of resource items or null</returns>
        public virtual IEnumerable<ResourceItem> GetResourceItems(string resourceId, string resourceSet, bool forAllResourceSetLocales = false)
        {
            ErrorMessage = string.Empty;

            if (resourceSet == null)
                resourceSet = string.Empty;
            
            List<ResourceItem> items = null;

            using (var data = GetDb())
            {
                using (IDataReader reader =
                    data.ExecuteReader(
                        "select * from " + Configuration.ResourceTableName +
                        " where ResourceId=@ResourceId and ResourceSet=@ResourceSet " +
                        " order by LocaleId",
                        data.CreateParameter("@ResourceId", resourceId),
                        data.CreateParameter("@ResourceSet", resourceSet)))
                {
                    if (reader == null)
                    {
                        SetError(data.ErrorMessage);
                        return null;
                    }
                        

                    items = new List<ResourceItem>();
                    while (reader.Read())
                    {
                        var item = new ResourceItem();
                        item.FromDataReader(reader);
                        items.Add(item);
                    }

                    reader.Close();
                }

                if (forAllResourceSetLocales)
                {
                    var locales = GetAllLocalesForResourceSet(resourceSet);
                    if (locales != null)
                    {
                        var usedLocales = items.Select(i => i.LocaleId);
                        var emptyLocales = locales.Where(s => !usedLocales.Contains(s));
                        foreach (var locale in emptyLocales)
                        {
                            items.Add(new ResourceItem(){ 
                                 LocaleId = locale,
                                 Value = "",
                                 ResourceSet = resourceSet
                            });
                        }
                    }
                }
            }

            return items;
        }
        /// <summary>
        /// Returns a resource item that returns both the Value and Comment to the
        /// fields to the client.
        /// </summary>
        /// <param name="resourceId">The ID of the resource to retrieve</param>
        /// <param name="resourceSet">Name of the ResourceSet to return</param>
        /// <param name="cultureName">required. Null or Empty returns invariant</param>
        /// <returns></returns>
        public virtual ResourceItem GetResourceItem(string resourceId, string resourceSet, string cultureName)
        {
            ErrorMessage = string.Empty;

            if (cultureName == null)
                cultureName = string.Empty;

            ResourceItem item;
            using (var data = GetDb())
            {
                using (IDataReader reader =
                    data.ExecuteReader(
                        "select * from " + Configuration.ResourceTableName +
                        " where ResourceId=@ResourceId and ResourceSet=@ResourceSet and LocaleId=@LocaleId",
                        data.CreateParameter("@ResourceId", resourceId),
                        data.CreateParameter("@ResourceSet", resourceSet),
                        data.CreateParameter("@LocaleId", cultureName)))
                {
                    if (reader == null || !reader.Read())
                        return null;

                    item = new ResourceItem();
                    item.FromDataReader(reader);

                    reader.Close();
                }
            }
            
            return item;
        }