简体   繁体   English

部署到 SSRS c# 中的目标文件夹时未创建子文件夹

[英]subfolders not being created when deployed to target folders in SSRS c#

I have a c# solution that creates folders in SSRS where I store my reports, data sources, data sets and images, however I seem to be experimenting an issue when deploying files to a new folder when one already exists on root that is populated with other SSRS files.我有一个 c# 解决方案,它在 SSRS 中创建文件夹,我在其中存储我的报告、数据源、数据集和图像,但是当我将文件部署到新文件夹时,我似乎正在尝试一个问题,而根目录上已经存在一个填充了其他文件的文件夹SSRS 文件。 I'm using reporting services 2010.我正在使用 2010 年的报告服务。

This is my Folder Hirearchy这是我的文件夹层次结构

在此处输入图像描述

This is the folder created by my first deployment even though there was an empty folder already created这是我第一次部署创建的文件夹,即使已经创建了一个空文件夹

在此处输入图像描述

Notice that the sub folders Data Source, Reports, ect are created and so the SSRS files populated inside, so no problem there, however when I try a second deployment this is what happens请注意,已创建子文件夹 Data Source、Reports 等,因此其中填充了 SSRS 文件,所以那里没有问题,但是当我尝试第二次部署时,会发生这种情况

在此处输入图像描述

It only creates the Data Set subfolder, without its data source它只创建数据集子文件夹,没有它的数据源

I tried creating the Other_Custom_SSRS with only the empty folder and the same thing happens, Other_Custom_SSRS has all its subfolders and files, yet when I create the Custom_SSRS folder afterwards, only the DataSet subolder is created.我尝试仅使用空文件夹创建 Other_Custom_SSRS 并且发生了同样的事情,Other_Custom_SSRS 具有其所有子文件夹和文件,但是当我之后创建 Custom_SSRS 文件夹时,只创建了 DataSet 子文件夹。

The error messages I keep getting are:我不断收到的错误消息是:

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)'

Code:代码:

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);
    }

I've researched and so far all the fixes involve VS deployment with the Report Builder or manual creation of the folders in SSRS, but I want to do it by code.我已经研究过,到目前为止,所有修复都涉及使用 Report Builder 进行 VS 部署或在 SSRS 中手动创建文件夹,但我想通过代码来完成。 Changing the folder herierchy is out of the question, I can't create the subfolders on Home and assign all reports to a Reports folder, I need to organize them by project.更改文件夹层级是不可能的,我无法在 Home 上创建子文件夹并将所有报告分配到 Reports 文件夹,我需要按项目组织它们。 If anyone can point out what I'm doing wrong that would be great.如果有人能指出我做错了什么,那就太好了。

I solved it with this line of code我用这行代码解决了它

folderItems = ssrsProxy.ListChildren(staffmPath, true); 

under if (CheckFolderExists(staffmPathName, folderItems))if (CheckFolderExists(staffmPathName, folderItems))

turns out it want creating the folders because when it checked if the item existed in the foldersItems object, it would return true.原来它想要创建文件夹,因为当它检查该项目是否存在于文件夹项目 object 中时,它会返回 true。 The folderItems object was listing the children of Home and since there was already a folder named "Reports" and "Data Source" and so on, it wouldn't create it. folderItems object 列出了 Home 的子项,并且由于已经有一个名为“Reports”和“Data Source”等的文件夹,因此不会创建它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM