【问题标题】:subfolders not being created when deployed to target folders in SSRS c#部署到 SSRS c# 中的目标文件夹时未创建子文件夹
【发布时间】:2020-07-01 16:08:15
【问题描述】:

我有一个 c# 解决方案,它在 SSRS 中创建文件夹,我在其中存储我的报告、数据源、数据集和图像,但是在将文件部署到新文件夹时,我似乎正在尝试一个问题,而根目录上已经存在一个文件填充了其他 SSRS 文件。我正在使用 2010 年的报告服务。

这是我的文件夹层次结构

这是我第一次部署时创建的文件夹,尽管已经创建了一个空文件夹

请注意,子文件夹 Data Source、Reports 等已创建,因此 SSRS 文件填充在其中,所以没有问题,但是当我尝试第二次部署时,会发生这种情况

它只创建数据集子文件夹,没有它的数据源

我尝试只使用空文件夹创建 Other_Custom_SSRS,同样的事情发生了,Other_Custom_SSRS 有它的所有子文件夹和文件,但是当我之后创建 Custom_SSRS 文件夹时,只创建了 DataSet 子文件夹。

我不断收到的错误消息是:

File dataSource.rds: Error was System.Web.Services.Protocols.SoapException: The item '/Other_Custom_SSRS/Data Source' cannot be found. ---> Microsoft.ReportingServices.Diagnostics.Utilities.ItemNotFoundException: The item '/Other_Custom_SSRS/Data Source' cannot be found.
   at Microsoft.ReportingServices.Library.ReportingService2010Impl.CreateDataSource(String DataSource, String Parent, Boolean Overwrite, DataSourceDefinition Definition, Property[] Properties, String ParameterName, CatalogItem& ItemInfo)
   at Microsoft.ReportingServices.WebServer.ReportingService2010.CreateDataSource(String DataSource, String Parent, Boolean Overwrite, DataSourceDefinition Definition, Property[] Properties, CatalogItem& ItemInfo).

File Report.rdl: Error was System.Web.Services.Protocols.SoapException: The item '/Other_Custom_SSRS/Reports' cannot be found. ---> Microsoft.ReportingServices.Diagnostics.Utilities.ItemNotFoundException: The item 'Other_Custom_SSRS' cannot be found.
   at Microsoft.ReportingServices.Library.ReportingService2010Impl.CreateReport(String Report, String Parent, Boolean Overwrite, Byte[] Definition, Property[] Properties, ItemType ItemType, CatalogItem& ItemInfo, Warning[]& Warnings)
   at Microsoft.ReportingServices.Library.ReportingService2010Impl.CreateCatalogItem(String ItemType, String Name, String Parent, Boolean Overwrite, Byte[] Definition, Property[] Properties, CatalogItem& ItemInfo, Warning[]& Warnings)
   at Microsoft.ReportingServices.WebServer.ReportingService2010.CreateCatalogItem(String ItemType, String Name, String Parent, Boolean Overwrite, Byte[] Definition, Property[] Properties, CatalogItem& ItemInfo, Warning[]& Warnings).

System.Web.Services.Protocols.SoapException: 'System.Web.Services.Protocols.SoapException: The item '/Other_Custon_SSRS/Reports' cannot be found. ---> Microsoft.ReportingServices.Diagnostics.Utilities.ItemNotFoundException: The item '/Other_Custon_SSRS/Reports' cannot be found.
   at Microsoft.ReportingServices.Library.ReportingService2010Impl.CreateReport(String Report, String Parent, Boolean Overwrite, Byte[] Definition, Property[] Properties, ItemType ItemType, CatalogItem& ItemInfo, Warning[]& Warnings)
   at Microsoft.ReportingServices.Library.ReportingService2010Impl.CreateCatalogItem(String ItemType, String Name, String Parent, Boolean Overwrite, Byte[] Definition, Property[] Properties, CatalogItem& ItemInfo, Warning[]& Warnings)
   at Microsoft.ReportingServices.WebServer.ReportingService2010.CreateCatalogItem(String ItemType, String Name, String Parent, Boolean Overwrite, Byte[] Definition, Property[] Properties, CatalogItem& ItemInfo, Warning[]& Warnings)'

代码:

public bool CreateFolderHierarchy(ReportingService2010 ssrsProxy)
    {
        CatalogItem[] folderItems = new CatalogItem[] {};

        try
        {
            folderItems = ssrsProxy.ListChildren("/", true);

            if (!CheckFolderExists(staffmPathName, folderItems))
            {
                ssrsProxy.CreateFolder(staffmPathName, "/", null);
            }

            folderItems = ssrsProxy.ListChildren("/", true);

            if (CheckFolderExists(staffmPathName, folderItems))
            {
                if (!CheckFolderExists(reportFolderName, folderItems))
                {
                    ssrsProxy.CreateFolder(reportFolderName, staffmPath, null);
                }

                if (!String.IsNullOrEmpty(targetImagesFolder))
                {
                    if (!CheckFolderExists(imagesFolderName, folderItems))
                    {
                        ssrsProxy.CreateFolder(imagesFolderName, staffmPath, null);
                    }
                }

                if (!CheckFolderExists(DataSourcePathName, folderItems))
                {
                    ssrsProxy.CreateFolder(DataSourcePathName, staffmPath, null);
                }

                if (!CheckFolderExists(DataSet_FolderName, folderItems))
                {
                    ssrsProxy.CreateFolder(DataSet_FolderName, staffmPath, null);
                }
            }

            return true;
        }
        catch (System.Web.Services.Protocols.SoapException)
        {
            return false;
        }
    }

       public string CreateDataSource(ReportingService2010 ssrsProxy, ref bool bHasErrors, ref bool errorFlag,
        string rdsFilePath)
    {
        try
        {
            var rdsf = Path.GetFileNameWithoutExtension(rdsFilePath);
            //Load datasource xml and create new data source with proper paths and references.
            XmlDocument Rds = new XmlDocument();
            Rds.Load(rdsFilePath);
            var ConnProps = Rds.SelectSingleNode("RptDataSource").SelectSingleNode("ConnectionProperties");
            var type = ssrsProxy.GetType().Namespace;
            var datatype = (type + ".DataSourceDefinition");
            var datatype_Prop = (type + ".Property");
            Property[] properties = new Property[]
                {PropertyFactory(datatype_Prop, DescProperty), PropertyFactory(datatype_Prop, HiddenProperty)};
            var Definition = (DataSourceDefinition) Activator.CreateInstance(Type.GetType(datatype));
            Definition.ConnectString = ConnProps.SelectSingleNode("ConnectString").FirstChild.Value;
            Definition.Extension = ConnProps.SelectSingleNode("Extension").FirstChild.Value;

            if (ConnProps.SelectSingleNode("IntegratedSecurity") != null &&
                Convert.ToBoolean(ConnProps.SelectSingleNode("IntegratedSecurity").FirstChild.Value))
            {
                Definition.CredentialRetrieval = CredentialRetrievalEnum.Integrated;
            }

            if (Convert.ToBoolean(Convert.ToInt32(IsOverwriteDataSource)))
            {
                ssrsProxy.CreateDataSource(rdsf, targetDataSourceFolder,
                    Convert.ToBoolean(Convert.ToInt32(IsOverwriteDataSource)), Definition, properties);
            }
            else //If not set to overwrite the data source, ignore error of data source already exists
            {
                try
                {
                    ssrsProxy.CreateDataSource(rdsf, targetDataSourceFolder,
                        Convert.ToBoolean(Convert.ToInt32(IsOverwriteDataSource)), Definition, properties);
                }
                catch (Exception ex)
                {
                    if (ex.Message != null &&
                        ex.Message.Contains($"The item '{targetDataSourceFolder}/{rdsf}' already exists."))
                    {
                        //If not set to overwrite the data source, ignore error of data source already exists
                    }
                    else
                        throw;
                }
            }
        }
        catch (Exception e)
        {
            bHasErrors = true;
            errorFlag = true;
            if (e.InnerException != null)
                return
                    string.Format("File: {2}: Error was {0}. Detail was {1}", e.Message, e.InnerException.ToString(),
                        Path.GetFileNameWithoutExtension(rdsFilePath)) + Constants.vbNewLine;
            else
                return
                    string.Format("File {1}: Error was {0}.", e.Message,
                        Path.GetFileNameWithoutExtension(rdsFilePath)) + Constants.vbNewLine;
        }

        return "";
    }

public string CreateReport(ReportingService2010 ssrsProxy, ref bool bHasErrors, ref bool errorFlag,
            string rdlFilePath)
        {
            var reportFolder_Final = staffmPath + targetReportFolder;

        var reportName = Path.GetFileNameWithoutExtension(rdlFilePath);
        try
        {
            //Get Report Content
            var byteArray = File.ReadAllBytes(rdlFilePath);
            var type = ssrsProxy.GetType().Namespace;
            var datatype_Prop = (type + ".Property");
            Property[] properties = new Property[]
                {PropertyFactory(datatype_Prop, DescProperty), PropertyFactory(datatype_Prop, HiddenProperty)};

            //Create the report
            Warning[] warnings = null;
            CatalogItem results = null;
            if (Convert.ToBoolean(Convert.ToInt32(isOverwriteReport)))
            {
                results = ssrsProxy.CreateCatalogItem("Report", reportName, reportFolder_Final,
                    Convert.ToBoolean(Convert.ToInt32(isOverwriteReport)), byteArray, properties, out warnings);
            }
            else //If not set to overwrite the report, ignore error of report already exists
            {
                try
                {
                    results = ssrsProxy.CreateCatalogItem("Report", reportName, reportFolder_Final,
                        Convert.ToBoolean(Convert.ToInt32(isOverwriteReport)), byteArray, properties, out warnings);
                }
                catch (Exception ex)
                {
                    if (ex.Message != null &&
                        ex.Message.Contains($"The item '{reportFolder_Final}/{reportName}' already exists."))
                    {
                        //If not set to overwrite the report, ignore error of report already exists
                    }
                    else
                    {
                        throw;
                    }
                }
            }

            var reportFullName = reportFolder_Final + @"/" + reportName;
            var rep = ssrsProxy.GetItemReferences(reportFullName, "DataSet");

            //Change Data Set reference on report
            foreach (ItemReferenceData ir in rep)
            {
                var proxyNamespace = ir.GetType().Namespace;
                string pathName = "";
                if (ir.Name == "dsRSTSTFMEmployeeClass")
                {
                    pathName = "dsRSTSTFMEmployeeClassification";
                }
                else if (ir.Name == "dsGPEmployeeClass")
                {
                    pathName = "dsGPEmployeeClassification";
                }
                else
                {
                    pathName = ir.Name;
                }
                var dsPath = targetDatasetFolder + @"/" + pathName;
                var reference = (ItemReference)Activator.CreateInstance(Type.GetType(proxyNamespace + ".ItemReference"));
                reference.Name = ir.Name;
                reference.Reference = dsPath;
                var references = new ItemReference[] { reference };
                ssrsProxy.SetItemReferences(reportFullName, references);
            }
            
            //Toggle for overwriting custom data source with shared data source.
            if (isOverwriteReportDataSource == "1")
            {
                //Get existing data source
                ReportService2010.DataSource[] itemDataSources = ssrsProxy.GetItemDataSources(reportFullName);

                //Change Data Source reference on report
                foreach (ReportService2010.DataSource itemDataSource in itemDataSources)
                {
                    var proxyNamespace = itemDataSource.GetType().Namespace;
                    var constDatasource = (DataSource)Activator.CreateInstance(Type.GetType(proxyNamespace + ".DataSource"));
                    constDatasource.Item = (DataSourceReference)Activator.CreateInstance(Type.GetType(proxyNamespace + ".DataSourceReference"));
                    var FinalDataSourcePath = targetDataSourceFolder + @"/" + MainDataSourceName; //MainDataSourceName
                    var r = (DataSourceReference)constDatasource.Item;
                    r.Reference = FinalDataSourcePath;
                    itemDataSource.Item = r;
                    ssrsProxy.SetItemDataSources(reportFullName, itemDataSources);
                }
            }
        }
        catch (Exception e)
        {
            bHasErrors = true;
            errorFlag = true;
            if (e.InnerException != null)
                return string.Format("File: {2}: Error was {0}. Detail was {1}", e.Message, e.InnerException.ToString(), Path.GetFileNameWithoutExtension(rdlFilePath)) + Constants.vbNewLine;
            else
                return string.Format("File {1}: Error was {0}.", e.Message, Path.GetFileNameWithoutExtension(rdlFilePath)) + Constants.vbNewLine;
        }

        return "";
    }


 private bool CheckFolderExists(string folderName, CatalogItem[] files)
    {
        return files.ToList().Any(x => x.Name == folderName);
    }

我已经研究过,到目前为止,所有修复都涉及使用报表生成器进行 VS 部署或在 SSRS 中手动创建文件夹,但我想通过代码来完成。更改文件夹层级是不可能的,我无法在 Home 上创建子文件夹并将所有报告分配给 Reports 文件夹,我需要按项目组织它们。如果有人能指出我做错了什么,那就太好了。

【问题讨论】:

    标签: c# reporting-services deployment


    【解决方案1】:

    我用这行代码解决了

    folderItems = ssrsProxy.ListChildren(staffmPath, true); 
    

    if (CheckFolderExists(staffmPathName, folderItems))

    原来它想要创建文件夹,因为当它检查项目是否存在于foldersItems 对象中时,它会返回true。 folderItems 对象列出了 Home 的子项,由于已经有一个名为“Reports”和“Data Source”等的文件夹,所以它不会创建它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多