我有一个要求,我需要能够在生成SSRS报告后将SSRS报告中的页面总数插入数据库,这是动态的。该报告也由服务自动运行,该服务创建并将其存储为pdf,因此没有用户与报告交互。
我觉得这在某种程度上是可行的,因为SSRS能够在运行报告时插入数据。但这种情况有点不同。原因是您无法在生成报告之前获取报告页面的数量,以便将其提供给您的数据集中插入的程序。
所以我尝试了一些事情:
尝试#1
我创建了一个包含2个矩形和一个子报告的报告。两个矩形之后都会进行分页。子报告包含一个名为
的参数PageAmount
然后我将此代码添加到第一个报告的代码属性
Function TotalPages() As String
Return Me.Report.Globals!TotalPages
End Function
返回报告中的总页数,以便在报告正文中使用。
然后我将它作为参数传递给子报告,如此
Code.TotalPages()
子报告在数据库中执行了插入操作,但结果始终为 1 。无论有多少页面都会是1.
尝试#2
由于您可以将自定义程序集导入SSRS以在代码中使用它,我想我会尝试使用c#代码进行插入。所以我编写了一个程序,它执行插入,测试并且工作正常。然后,我构建了自定义程序集并将其导入到报告文件中。进行插入的方法的代码是沿着这些方向的(我知道代码可以在很多方面得到改进,但这只是用于测试):
namespace MyNamespace
{
public class myClass
{
public static string InsertPageNumberDB(int id, string returnValue)
{
try
{
string connection = "Data Source = Server; Initial Catalog = Database; User ID = Username; Password = Password";
using(SqlConnection conn = new SqlConnection(connection))
{
conn.open();
SqlCommand cmd = new SqlCommand("INSERT INTO TABLE VALUES(" + id.ToString() + ", " + returnValue + ")", conn);
cmd.ExecuteNonQuery();
}
}
catch(Exception ex)
{
return ex.ToString();
}
return returnValue;
}
}
}
导入后,我能够在报表的页脚中的表达式中使用它,如下所示:
Code.MyClass.InsertPageNumberDB(1, Globals!TotalPages.ToString())
因此,这将显示页码并将其插入表中。它没有用,而是返回了一个例外:
[SecurityException: Request for the permission of type
'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=################' failed.]
从SSRS运行时,似乎无法验证尝试连接到数据库的用户的异常。
编辑:进一步调查后,连接请求无法到达数据库。它在尝试连接之前失败了。它可以来自System.Data.SqlClient dll吗?
所以我的问题是:有没有办法在表格中插入报告生成后的页面数量?如果没有,是否有办法以编程方式计算pdf文件中的页数?
感谢任何帮助。
干杯,