代码之家  ›  专栏  ›  技术社区  ›  Maestro1024

VS 2008报表控件中SQL Reporting Services的报表查看器

  •  0
  • Maestro1024  · 技术社区  · 15 年前

    VS 2008报表控件中SQL Reporting Services的报表查看器 如果我在vs 2008中创建了一个新报告,那么它们有一个.rdlc扩展名,并且工作正常。

    我有一些在sql reporting services中使用的报表。扩展名是.rdl,希望让它们与vs 2008一起工作。

    我将rdl文件和.rdl.data文件复制到vs 2008(sp1)项目中,但是当我在控件中选择报表时,它看不到该文件(我假设它正在查找.rdlc文件)

    我尝试将文件重命名为.rdlc并加载文件,得到

    报表定义包含无效的 目标名称空间 ’ http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition ’ 无法升级。

    我看到了 http://social.msdn.microsoft.com/Forums/en-SG/vsreportcontrols/thread/65cefd7d-00d8-4be6-a53a-7e34dfd7eb2b

    我在这里看到 http://www.gotreportviewer.com/ 它说 “rdl文件与reportviewer控件运行时完全兼容。但是,rdl文件不包含reportviewer控件的设计时自动生成数据绑定代码所依赖的某些信息。通过手动绑定数据,可以在reportviewer控件中使用rdl文件。”

    但如何手动绑定数据的链接已断开。

    对如何手动重新绑定数据有什么想法吗?或者更好的方法让这些报告与2008年的控制一起工作?

    2 回复  |  直到 15 年前
        1
  •  1
  •   marc_s    15 年前

    很遗憾,ssrs 2008中的服务器版本*.rdl 与本地对应的*.rdlc文件兼容。

    基本上,你能做的就是

    • 直接在服务器上使用.rdl(在reportviewer控件中使用“远程呈现”报表)

    • 基本上从头将整个报表重新创建为本地报表

    难以置信,但不幸的是,这是事实……让我们希望使用.net 4和visual studio 2010会更好。

        2
  •  1
  •   queen3    15 年前

    如果您不需要深入了解等高级功能,并且无法使用VS2010,则可以执行以下操作(我这样做):

    • 从vs2010安装新的reportviewer.exe(我猜是beta2或更高版本);
    • 向引用中添加10.0版reportviewer的common/webforms程序集;
    • 手动解析rdl xml结构,得到数据源和/或查询sql(非常简单);
    • 使用它来填充localreport.datasource;
    • 执行localreport.render(“pdf”)以获取pdf输出(生成pdf响应的actionresult代码很容易找到);
    • 在页面和iframe上放置“查看”按钮;
    • “查看”按钮(通过javascript)将iframe src属性分配给返回上述pdf内容的url,并且它将在iframe中提供报告的良好pdf预览;
    • 或者,可以使用jquery媒体插件呈现具有相同结果的pdf对象标记;
    • 此外,我解析rdl xml参数并在页面上显示它们,并将它们传递到“generate report”url-我得到了自己的良好ui控件作为参数的好处;
    • 此外,我还有自己的“导出”按钮,这些按钮调用localreport.render(format),并提供正确的mime类型(即excel、word、pdf和我的手动csv)的输出-在新版本的报表查看器中,导出得到了改进。

    上面的列表可能看起来很吓人,但我只用了2天就破解了asp.net mvc中的完整解决方案,而且它只有大约300行代码,包括我自己的csv版本。

    一旦获得datatable/dataset(来自xml查询),绑定数据的代码就非常简单:

            var reportDataSource = new ReportDataSource();
            reportDataSource.Name = name;
            reportDataSource.Value = ds.Tables[0];
            localreport.DataSources.Add(reportDataSource);