none
DataSource cannot be found in SSRS RRS feed

  • Question

  • Hi everyone,

    I am programmatically trying to deploy report in SQL Server Reporting Services.

    I have created the Report Folder and Data Source Folder with the xxxx.rdl and  XXX_DataSource respectively.

    But when trying to assign a DataSource to a report in Report Folder using following code:

    string dsname = aReport.DataSource.Split('/').Last();

    rsc.CreateReport(aReport.Name, aReport.Folder, true, definition, null);

    DataSourceReference reference = new DataSourceReference                       

    reference.Reference = aReport.DataSource;

    DataSource[] dataSources = new DataSource[1];

    DataSource ds = new DataSource();//creates new instance of DataSource

    ds.Item = (DataSourceDefinitionOrReference)reference;

    ds.Name = dsname;

    dataSources[0] = ds;

    //dataSources = rsc.GetItemDataSources("/" + aReport.DataSource);                       

    rsc.SetItemDataSources(@""+ aReport.Folder + "/" + aReport.Name, dataSources);

     

    it is generating an error saying:

    System.Web.Services.Protocols.SoapException: The data source 'XXX_DataSource' cannot be found. ---> Microsoft.ReportingServices.Diagnostics.Utilities.DataSourceNotFoundException: The data source 'XXX_DataSource' cannot be found.
       at Microsoft.ReportingServices.WebServer.ReportingService2005Impl.SetItemDataSources(String Item, DataSource[] DataSources)
       at Microsoft.ReportingServices.WebServer.ReportingService2005.SetItemDataSources(String Item, DataSource[] DataSources)

    Thanks in Advance!

     

    --Praveen


    Tuesday, May 3, 2011 2:16 PM

Answers

  • Hi Praveen,

    Thanks for the prompt reply and updating with the codes. To my understanding, the DataSource XML structure is defined by yourself rather than the DataSource setting in the xxxx.RDL file, right?

    If that is the case, what I suggested in my previously reply was "check the data source name accordingly, and make sure they are exactly match to the defined data source in xxxx.rdl." What I mean is that, open the xxxx.rdl file in a notepad for example, and check the following XML code,

      <DataSources>
        <DataSource Name="DataSource1">
        ...
        </DataSource>
      </DataSources>

    Make sure the DataSource Name is exactly matched to the name "Stride_DataSource", or you need to rename "Stride_DataSource" to the DataSource name used in xxxx.RDL.

    If you have any question, please feel free to ask.

    Thanks,
    Eileen.

    • Marked as answer by Praveen MB Monday, May 9, 2011 3:45 PM
    Monday, May 9, 2011 2:31 PM
  • Hi Eileen,

    Thanks again for your reply.

    Yes the problem was the Report which I was Uploading to the server was having different datasource and hence it is not getting the Datasource which I have defined in my Datasource xml file.

    Now it's working perfectly OK.

    Thanks for your Help.

     

    • Marked as answer by Praveen MB Monday, May 9, 2011 3:45 PM
    Monday, May 9, 2011 3:45 PM

All replies

  • Which class you uesd for aReport object ?
    SUHAS R. KUDEKAR http://suhaskudekar.blogspot.com/ Please click "Mark as Answer" if this resolves your problem or "Vote as Helpful" if you find it helpful.
    Tuesday, May 3, 2011 2:27 PM
  • Report Class I have used for aReport.

    The problem is

    rsc.SetItemDataSources(@""+ aReport.Folder + "/" + aReport.Name, dataSources);

    throwing exception

    System.Web.Services.Protocols.SoapException: The data source 'XXX_DataSource' cannot be found. ---> Microsoft.ReportingServices.Diagnostics.Utilities.DataSourceNotFoundException: The data source 'XXX_DataSource' cannot be found.
       at Microsoft.ReportingServices.WebServer.ReportingService2005Impl.SetItemDataSources(String Item, DataSource[] DataSources)
       at Microsoft.ReportingServices.WebServer.ReportingService2005.SetItemDataSources(String Item, DataSource[] DataSources)

    Wednesday, May 4, 2011 6:09 AM
  • Hi Praveen MB,

    SetItemDataSources basically replaces the existing data sources associated with the report with the new data sources reference or definition passed in. RS uses data source name to match the old datasources and the new data sources. If the name of a new data source cannot be found, a DataSourceNotFoundException will be thrown.

    I would suggest you check the data source name accordingly, and make sure they are exactly match to the defined data source in xxxx.rdl.

    Furthermore, if you can provide full code as well as the report definition code, I can help verify them on my server.

    Thanks,
    Eileen

    Sunday, May 8, 2011 10:54 AM
  • Thanks for your immediate Reply Eileen.

    I am using CreateFolders() to create two folder:

    <Folders>
    <Folder>
    <Name>Reports_Folder</Name>
    <ParentFolder>/</ParentFolder>
    </Folder>
    <Folder>
    <Name>DataSource_Folder</Name>
    <ParentFolder>/</ParentFolder>
    </Folder>
    </Folders>

    And then CreateDataSources() to create Data source:

     

    <DataSource>

      <Name>Stride_DataSource</Name>

      <Folder>/DataSource_Folder</Folder>

      <Description>Stride Test Deploy</Description>

      <HideInListView>False</HideInListView>

      <Enabled>True</Enabled>

      <ConnectionString>Data Source=10.200.20.62;Initial Catalog=STRIDE6RQS</ConnectionString>

      <Extension>SQL</Extension>

      <CredentialRetrieval>Store</CredentialRetrieval>

      <WindowsCredentials>False</WindowsCredentials>

      <ImpersonateUser>True</ImpersonateUser>

      <ImpersonateUserSpecified>False</ImpersonateUserSpecified>

      <Prompt>null</Prompt>

      <UserName>sa</UserName>

      <Password>sa</Password>

      <EnabledSpecified>True</EnabledSpecified>

    </DataSource>

     

    private void CreateDataSources(string datasourceXMLFilePath)

            {

                ReportingService2005 reportingServicesClient = new ReportingService2005();

                reportingServicesClient.Credentials = System.Net.CredentialCache.DefaultCredentials;

                DataSourceDefinition tempDataSource;

                XDocument xmlDoc = XDocument.Load(datasourceXMLFilePath);

                try

                {

                                      var result = from c in xmlDoc.Descendants("DataSource")

                                 select new

                                 {

                                     name = (string)c.Element("Name").Value,

                                     folder = (string)c.Element("Folder").Value,

                                     description = (string)c.Element("Description").Value,

                                     hideInListView = (string)c.Element("HideInListView").Value,

                                     enabled = (string)c.Element("Enabled").Value,

                                     connectionString = (string)c.Element("ConnectionString").Value,

                                     extension = (string)c.Element("Extension").Value,

                                     credentialRetrieval = (string)c.Element("CredentialRetrieval").Value,

                                     windowsCredentials = (string)c.Element("WindowsCredentials").Value,

                                     impersonateUser = (string)c.Element("ImpersonateUser").Value,

                                     impersonateUserSpecified = (string)c.Element("ImpersonateUserSpecified").Value,

                                     prompt = (string)c.Element("Prompt").Value,

                                     userName = (string)c.Element("UserName").Value,

                                     password = (string)c.Element("Password").Value,

                                     enabledSpecified = (string)c.Element("EnabledSpecified").Value

                                 };

                    foreach (var row in result)

                    {

                        CredentialRetrievalEnum credentialRetrieval;

                        EnumConverter ec = new EnumConverter(typeof(CredentialRetrievalEnum));

                        credentialRetrieval = (CredentialRetrievalEnum)ec.ConvertFromString(row.credentialRetrieval);

                        tempDataSource = new DataSourceDefinition();                     

                        tempDataSource.CredentialRetrieval = credentialRetrieval;

                        tempDataSource.ConnectString = row.connectionString;

                        tempDataSource.Enabled = bool.Parse(row.enabled);

                        tempDataSource.EnabledSpecified = bool.Parse(row.enabledSpecified);

                        tempDataSource.Extension = row.extension;

                        tempDataSource.ImpersonateUserSpecified = bool.Parse(row.impersonateUserSpecified);

                        tempDataSource.ImpersonateUser = bool.Parse(row.impersonateUser);

                        tempDataSource.Prompt = row.prompt;

                        tempDataSource.WindowsCredentials = bool.Parse(row.windowsCredentials);

                        if (!String.IsNullOrEmpty(row.userName))

                            tempDataSource.UserName = row.userName;

                        if (!String.IsNullOrEmpty(row.password))

                            tempDataSource.Password = row.password;

                        try

                        {

                            reportingServicesClient.CreateDataSource(row.name,row.folder, true, tempDataSource, null);                     

                            Logging.Log(string.Format("Data Source {0} has created successfully", row.name));

                        }

                        catch (SoapException e)

                        {

                            Logging.Log(e.Detail.InnerXml.ToString());

                        }

                    }

                }

                catch (Exception er)

                {

                    Logging.Log(er.Message);

                }

            }

     

    And then CreateReports() to create Reports:

     

    private void CreateReports(Report[] reports)

            {

                ReportingService2005 rsc = new ReportingService2005();

                rsc.Credentials = System.Net.CredentialCache.DefaultCredentials;

                foreach (Report aReport in reports)

                {

                        Byte[] definition = null;

                        Warning[] warnings = null;

                        try

                        {

                            FileStream stream = File.OpenRead(aReport.Path);

                            definition = new Byte[stream.Length];

                            stream.Read(definition, 0, (int)stream.Length);

                            stream.Close();

                        }

                        catch (IOException e)

                        {

                        Logging.Log(e.Message);

                        }

                            string dsname = aReport.DataSource.Split('/').Last();

                            rsc.CreateReport(aReport.Name, aReport.Folder, true, definition, null);

                            DataSourceReference reference = new DataSourceReference();

                            reference.Reference = aReport.DataSource;

                            DataSource[] dataSources = new DataSource[1];//creates an array of 1 of DataSource

                            DataSource ds = new DataSource();//creates new instance of DataSource

                            ds.Item = (DataSourceDefinitionOrReference)reference;

                            ds.Name = dsname;

                           dataSources[0] = ds;

                                                     

                           //dataSources = rsc.GetItemDataSources("/" + aReport.DataSource);                                               

                            rsc.SetItemDataSources(@""+ aReport.Folder + "/" + aReport.Name, dataSources);

                            }

     

    Thanks in Advance,

    Praveen


    Monday, May 9, 2011 10:02 AM
  • Hi Praveen,

    Thanks for the prompt reply and updating with the codes. To my understanding, the DataSource XML structure is defined by yourself rather than the DataSource setting in the xxxx.RDL file, right?

    If that is the case, what I suggested in my previously reply was "check the data source name accordingly, and make sure they are exactly match to the defined data source in xxxx.rdl." What I mean is that, open the xxxx.rdl file in a notepad for example, and check the following XML code,

      <DataSources>
        <DataSource Name="DataSource1">
        ...
        </DataSource>
      </DataSources>

    Make sure the DataSource Name is exactly matched to the name "Stride_DataSource", or you need to rename "Stride_DataSource" to the DataSource name used in xxxx.RDL.

    If you have any question, please feel free to ask.

    Thanks,
    Eileen.

    • Marked as answer by Praveen MB Monday, May 9, 2011 3:45 PM
    Monday, May 9, 2011 2:31 PM
  • Hi Eileen,

    Thanks again for your reply.

    Yes the problem was the Report which I was Uploading to the server was having different datasource and hence it is not getting the Datasource which I have defined in my Datasource xml file.

    Now it's working perfectly OK.

    Thanks for your Help.

     

    • Marked as answer by Praveen MB Monday, May 9, 2011 3:45 PM
    Monday, May 9, 2011 3:45 PM