如何将非表数据导入SQL Server Reporting Services?

时间:2009-05-07 13:49:24

标签: c# sql web-services reporting-services

给定:一个C#计算引擎,它加载一个对象模型,处理大量数字,并将结果保存到SQL Server中的几个巨大的索引数据库表中。这些表为Web界面,其他软件模块和SQL Server Reporting Services 2005报告提供数据。

我设法在最新版本的软件中使引擎更快批次,现在它可以根据请求提供数据 - 有时甚至比查询时间更快预先计算的数字的数据库。我很高兴。

这一突破意味着我们可以根据Web界面和其他软件模块的请求生成数据。但是缓存表还没有消失,因为它们被SSRS报告所使用(或者更具体地说,是通过查询表并将数据提供给SSRS的存储过程。)

缓存表很痛苦,就像任何缓存都是软件世界的痛苦一样。没有太多的细节,他们有同步问题,锁定问题等等。如果我不必担心保持这些darned表更新,软件将更好地工作。

但我怎样才能将数据导入SSRS?我做了很多研究,没有什么看起来太有希望了:

  • 我们可以通过Web服务提供数据并使用SSRS XML DPE。但这看起来有点可怕 - 我是对的,你必须自己解析你的SOAP信封吗?!它不支持XPath,而是一种专有的XPath-y方言?我们的报告编写者了解T-SQL,这就是他们最擅长的。
  • 使用SQL CLR来托管我们的API是不可取的 - 它是一个很大的应用程序,如果不创建应用程序对象并登录等,你就无法做任何事情。
  • 使用SQL CLR联系Web应用程序上的Web服务 - 这是迄今为止最有希望的(本文很有帮助http://www.simple-talk.com/sql/sql-server-2005/practical-sql-server-2005-clr-assemblies/。)是否有人尝试过这种方法?它是否运行良好,是否可以提供大型数据集? OTOH我被客户端数据库服务器上的额外设置关闭了。
  • 非常感谢任何其他建议。

7 个答案:

答案 0 :(得分:9)

如果我理解正确,那么您正在构建有关非SQL数据的报告。您将数据存储在表中,以使其具有可报告的特定目的。

我可以想到两个解决方案。第一种是使用reporting part扩展您的C#计算引擎。 Microsoft.Reporting.WinForms和Microsoft.Reporting.WebForms命名空间可用于在任何数据源上构建报告,而不仅仅是SQL Server。如果最终用户将您的应用用作客户端,则可以即时生成数据和报告。

第二种是使用SQL CLR。您可以使用CLR存储过程作为报告的基础(输入“exec mysp”作为数据源。)此CLR过程是C#代码,可以将您的计算引擎包含为库。这样您就可以动态生成报告,同时仍然使用Report Server用户界面。

有趣的问题,我希望更多知识渊博的人能提供更好的答案:)

答案 1 :(得分:3)

我以前遇到过类似情况,并尝试过SSRS XML数据源和Andomar提到的报告扩展。我的建议是使用SSRS XML数据源功能。如果Web服务返回的数据结构很简单,那么XPath也很简单。我还发现它更容易调试。需要注意的主要是超时。

使用Web服务的好处在于它们很容易被许多不同的技术所使用,因此它们可以变得非常方便。

此外,这是个人选择,但尽管有SQL CLR功能,我仍然觉得将代码放入数据库感觉不舒服。通过在SSRS中使用XML数据源,根本不需要涉及自定义CLR代码。

答案 2 :(得分:3)

您可以将数据包装在ADO.NET DataSet and use it as a Reporting Services Data Source.

我从来没有亲自使用过这个,所以我不能给你更多的信息。但是,我知道你可以从我参加的SSRS课程中做到这一点。教师在“真实世界”示例中执行此操作时给出的示例是,如果您需要连接来自两个不同数据源的数据。例如,如果要在一个报告中将SQL Server和Oracle中的数据关联在一起,则可以执行此操作。

我知道这不是你想要做的,但听起来它会提供你需要的同一层抽象。

答案 3 :(得分:2)

您是否考虑过编写自己的自定义数据库驱动程序,它位于计算引擎之上?然后,您可以将报告服务指向它。尽管这可能是一项复杂的任务,但这会使事情变得更快。我过去曾经考虑过我正在开发的专有数据仓库软件,但从来没有开始构建驱动程序。

顺便提一下。

答案 4 :(得分:1)

  

使用SQL CLR联系网站   Web应用程序上的服务

这是我推荐的方式 - 我这样做是为了通过他们的网络服务访问SharePoint列表数据。如果可以修复数据模式,那么SQL CLR TVF可能非常适合并且具有最大的灵活性。如果需要在执行时确定模式,则SQL CLR存储过程就是您想要的,因为它没有绑定到模式。

您需要的关键事项是:

-- enable CLR on the server
sp_configure 'clr_enabled', 1
GO
RECONFIGURE
GO

-- allow your db to execute clr code marked EXTERNAL or UNSAFE
alter database mydb set trustworthy on

然后创建一个VS sql clr项目(您不必,但它有助于部署和调试它),将权限级别设置为“外部”。如果在VS项目中使用“添加Web引用”,则必须在生成/部署后打开序列化程序集和CREATE ASSEMBLY的生成以加载它。

现在这有点波动了 - 老实说,我已经做到了 - 我稍后会添加一些细节。上个月我在SQL CLR上发表了演讲。我的sample code有一个GetFibs项目,它调用了一个Web服务(Fibonnaci),它也包含在内。

另请查看此处:http://footheory.com/blogs/bennie/archive/2006/12/07/invoking-a-web-service-from-a-sqlclr-stored-procedure.aspxhttp://www.codeproject.com/KB/database/SQLCLR.aspx?display=Print

  

它是否表现良好,是否可以提供   大数据集?

是的,它似乎表现良好。通过一些额外的工作,您可以以更加流的方式构建它,它不会占用整个集合的内存。请参阅范围示例或here

答案 5 :(得分:1)

我绝对会走下ADO.NET DPE road。如果您的数据源可以实时提供必要的数据,那么它将是最有意义的。您将节省1,2或3层,这肯定会提高整体性能。而不是谈论每个代码的维护。将数字处理数据公开为ADO.NET数据集并让您的报表服务直接查询,在我看来是最好的。

答案 6 :(得分:1)

在SQL 2008中,您可以使用SQL SSIS包作为数据源。 编写SSIS包以动态执行计算引擎并输出内存中.net数据集(DataReaderDestination)。然后可以将其用于报告。