/// <summary> /// Gets an ID from the Repository for this Data Source. /// </summary> /// <param name="reportingServer2010">The SQL 2008 R2 reporting server connection</param> /// <param name="path">Where the Datasource is in the Reporting Server</param> /// <returns>The Repository ID.</returns> private int HandleDataSource(SSRS2010.ReportingService2010 reportingServer2010, string path) { int idValue; SSRS2010.DataSourceDefinition dsDef = reportingServer2010.GetDataSourceContents(path); if (!datasourceInRepository.TryGetValue(path, out idValue)) { idValue = repository.GetConnection(dsDef.ConnectString); if (idValue == -1) { idValue = repository.AddObject(path, dsDef.ConnectString, Repository.OLEDBGuid, repository.RootRepositoryObjectID); repository.AddAttribute(idValue, Repository.Attributes.ConnectionString, dsDef.ConnectString); DbConnectionStringBuilder connectionStringBuilder = repository.GetConnectionStringBuilder(dsDef.ConnectString); if (connectionStringBuilder == null) { connectionStringBuilder = repository.GetConnectionStringBuilder(string.Empty); } string Server = repository.GetServer(connectionStringBuilder); string Database = repository.GetDatabase(connectionStringBuilder); if (string.IsNullOrEmpty(Server)) { repository.AddAttribute(idValue, Repository.Attributes.ConnectionServer, "(NULL)"); } else { repository.AddAttribute(idValue, Repository.Attributes.ConnectionServer, Server); } if (string.IsNullOrEmpty(Database)) { repository.AddAttribute(idValue, Repository.Attributes.ConnectionDatabase, "(NULL)"); } else { repository.AddAttribute(idValue, Repository.Attributes.ConnectionDatabase, Database); } } datasourceInRepository.Add(path, idValue); } return(idValue); }
public void EnumerateReportingServer(string reportingServerURL, bool recursive, bool storeThreePartNames) { Boolean isRS2010 = true, isRS2005 = false; Uri reportingServerUri = new Uri(reportingServerURL); string decodedURL, decodedPath; SSRS2010.CatalogItem[] items2010 = null; SSRS2010.ReportingService2010 reportingServer2010 = new SSRS2010.ReportingService2010(); threePartNames = storeThreePartNames; if (reportingServerUri.IsDefaultPort) { decodedURL = reportingServerUri.Scheme + "://" + reportingServerUri.Host + reportingServerUri.LocalPath; } else { decodedURL = reportingServerUri.Scheme + "://" + reportingServerUri.Host + ":" + reportingServerUri.Port.ToString() + reportingServerUri.LocalPath; } decodedPath = Uri.UnescapeDataString(reportingServerUri.Query.Substring(1)); reportingServer2010.Credentials = System.Net.CredentialCache.DefaultCredentials; reportingServer2010.Url = decodedURL + @"/ReportService2010.asmx"; // Assign the Report Server ID, so that all subsequent objects can be related to this. reportServerID = repository.AddObject(reportingServerUri.Host, decodedURL, ReportEnumerator.ObjectTypes.ReportServer, repository.RootRepositoryObjectID); SSRS2005.CatalogItem[] items2005 = null; SSRS2005.ReportingService2005 reportingServer2005 = new SSRS2005.ReportingService2005(); reportingServer2005.Credentials = System.Net.CredentialCache.DefaultCredentials; reportingServer2005.Url = decodedURL + @"/ReportService2005.asmx"; datasourceInRepository = new Dictionary <string, int>(); // Try to connect to the Reporting Server as SQL 2008 R2 first. try { items2010 = reportingServer2010.ListChildren(decodedPath, false); } catch { isRS2010 = false; } if (!isRS2010) { try { items2005 = reportingServer2005.ListChildren(decodedPath, false); isRS2005 = true; } catch (Exception ex) { Console.WriteLine(string.Format("Unable to connect to either SQL2008R2 or SQL2005 services\r\nMessage {0}\r\nStack Trace {1}", ex.Message, ex.StackTrace)); return; } } else { Enumerate2010Server(reportingServer2010, decodedPath, recursive); } if (isRS2005) { Enumerate2005Server(reportingServer2005, decodedPath, recursive); } }
private void Enumerate2010Server(SSRS2010.ReportingService2010 reportingServer2010, String path, bool recursive) { byte[] reportDefinition = null; String commandText = string.Empty; String dsName = string.Empty; String sdsName = string.Empty; int reportID = -1; int dsID = -1; SSRS2010.DataSourceDefinition dsDef; SSRS2010.DataSource[] dsArray; Dictionary <String, int> dsNameToRepository = new Dictionary <string, int>(); // Get the array of items that are in the location that has been requested. SSRS2010.CatalogItem[] items = reportingServer2010.ListChildren(path, recursive); // Step through the items. foreach (SSRS2010.CatalogItem item in items) { dsNameToRepository.Clear(); #region item.TypeName = Report if (item.TypeName == "Report") { Console.WriteLine(string.Format("Analysing Report {0}", item.Name)); reportID = repository.AddObject(item.Path, item.Name, ReportEnumerator.ObjectTypes.Report, reportServerID); reportDefinition = reportingServer2010.GetItemDefinition(item.Path); dsArray = reportingServer2010.GetItemDataSources(item.Path); foreach (SSRS2010.DataSource ds in dsArray) { if (ds.Item is SSRS2010.DataSourceReference) { dsNameToRepository.Add(ds.Name, HandleDataSource(reportingServer2010, ((SSRS2010.DataSourceReference)ds.Item).Reference)); } else if (ds.Item is SSRS2010.DataSourceDefinition) { if (!String.IsNullOrEmpty(((SSRS2010.DataSourceDefinition)ds.Item).ConnectString)) // Don't create if there is an empty Connection String. { dsNameToRepository.Add(ds.Name, HandleDataSource(((SSRS2010.DataSourceDefinition)ds.Item).ConnectString, ds.Name)); } } else if (ds.Item is SSRS2010.InvalidDataSourceReference) { dsNameToRepository.Add(ds.Name, HandleDataSource(String.Empty, ds.Name)); } } using (var stream = new MemoryStream(reportDefinition)) { using (var xmlreader = new XmlTextReader(stream)) { xmlreader.MoveToContent(); // Find any DataSources if (xmlreader.ReadToDescendant("DataSource")) { do { XmlReader dsReader = xmlreader.ReadSubtree(); dsReader.MoveToContent(); if (dsReader.IsStartElement("DataSource")) { dsName = dsReader.GetAttribute("Name"); while (dsReader.ReadToDescendant("ConnectString")) { String connectionString = dsReader.ReadString(); if (String.IsNullOrEmpty(connectionString)) { connectionString = String.Empty; } if (!dsNameToRepository.TryGetValue(dsName, out dsID)) { Console.WriteLine(string.Format("Unable to locate DataSourceName {0} Using First Value", dsName)); dsNameToRepository.Add(dsName, HandleDataSource(connectionString, dsName)); } } } }while (xmlreader.ReadToFollowing("DataSource")); } } } using (var stream = new MemoryStream(reportDefinition)) { using (var xmlreader = new XmlTextReader(stream)) { xmlreader.MoveToContent(); // Now find any DataSet. if (xmlreader.ReadToDescendant("DataSet")) { do { XmlReader dsReader = xmlreader.ReadSubtree(); dsReader.MoveToContent(); if (dsReader.IsStartElement("DataSet")) { dsReader.ReadStartElement(); dsReader.MoveToContent(); } if (dsReader.IsStartElement("Query")) { while (dsReader.ReadToDescendant("DataSourceName")) { dsName = dsReader.ReadString(); dsID = -1; if (!dsNameToRepository.TryGetValue(dsName, out dsID)) { Console.WriteLine(string.Format("Unable to locate DataSourceName {0} Creating with Empty Connection String", dsName)); dsNameToRepository.Add(dsName, HandleDataSource(String.Empty, dsName)); dsNameToRepository.TryGetValue(dsName, out dsID); } } while (dsReader.ReadToNextSibling("CommandText")) { commandText = dsReader.ReadString(); } if (dsID != -1) { ParseTSqlStatement(commandText, dsID, reportID); } } else if (dsReader.IsStartElement("Fields")) { dsReader.ReadInnerXml(); if (dsReader.IsStartElement("Query")) { while (dsReader.ReadToDescendant("DataSourceName")) { dsName = dsReader.ReadString(); dsID = -1; if (!dsNameToRepository.TryGetValue(dsName, out dsID)) { Console.WriteLine(string.Format("Unable to locate DataSourceName {0} Using First Value", dsName)); dsID = dsNameToRepository.ElementAt(0).Value; } } while (dsReader.ReadToNextSibling("CommandText")) { commandText = dsReader.ReadString(); } if (dsID != -1) { ParseTSqlStatement(commandText, dsID, reportID); } } } else { while (dsReader.ReadToDescendant("SharedDataSetReference")) { sdsName = dsReader.ReadString(); dsID = repository.GetDataSet(sdsName, reportServerID); if (!repository.DoesMappingExist(dsID, reportID)) { repository.AddMapping(dsID, reportID); } dsID = -1; } } }while (xmlreader.ReadToFollowing("DataSet")); } } } } #endregion else if (item.TypeName == "DataSource") { HandleDataSource(reportingServer2010, item.Path); } else if (item.TypeName == "DataSet") { reportDefinition = reportingServer2010.GetItemDefinition(item.Path); reportID = repository.GetDataSet(item.Path, reportServerID); dsArray = reportingServer2010.GetItemDataSources(item.Path); foreach (SSRS2010.DataSource ds in dsArray) { if (ds.Item is SSRS2010.DataSourceReference) { dsNameToRepository.Add(((SSRS2010.DataSourceReference)ds.Item).Reference, HandleDataSource(reportingServer2010, ((SSRS2010.DataSourceReference)ds.Item).Reference)); } else if (ds.Item is SSRS2010.DataSourceDefinition) { dsNameToRepository.Add(ds.Name, HandleDataSource(((SSRS2010.DataSourceDefinition)ds.Item).ConnectString, ds.Name)); } } using (var stream = new MemoryStream(reportDefinition)) { using (var xmlreader = new XmlTextReader(stream)) { xmlreader.MoveToContent(); while (xmlreader.ReadToDescendant("DataSourceReference")) { dsName = xmlreader.ReadString(); dsID = -1; if (!dsNameToRepository.TryGetValue(dsName, out dsID)) { Console.WriteLine(string.Format("Unable to locate DataSourceName {0} Using First Entry", dsName)); dsID = dsNameToRepository.ElementAt(0).Value; } } while (xmlreader.ReadToNextSibling("CommandText")) { commandText = xmlreader.ReadString(); } if (dsID != -1) { ParseTSqlStatement(commandText, dsID, reportID); } } } } } }