【发布时间】: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