C# 报表查看器-请求SqlClientPermission类型的权限失败

C# 报表查看器-请求SqlClientPermission类型的权限失败,c#,winforms,visual-studio-2008,reporting-services,sqlclient,C#,Winforms,Visual Studio 2008,Reporting Services,Sqlclient,我在本地模式下使用VisualStudio2008中的ReportViewer控件,并将对象作为数据源。我的类映射到数据库中的数据表。在对象中,它根据需要加载相关对象。因此,它会将引用保留为null,直到您尝试使用该属性,然后它会尝试自动从数据库加载该属性。这些类使用System.Data.SqlClient命名空间 当我与Windows窗体应用程序中的对象交互时,一切都按预期进行。但是,当我传递要用作报表数据源的对象时,它试图自动加载相关对象,但失败了。代码创建了一个SqlConnection

我在本地模式下使用VisualStudio2008中的ReportViewer控件,并将对象作为数据源。我的类映射到数据库中的数据表。在对象中,它根据需要加载相关对象。因此,它会将引用保留为null,直到您尝试使用该属性,然后它会尝试自动从数据库加载该属性。这些类使用System.Data.SqlClient命名空间

当我与Windows窗体应用程序中的对象交互时,一切都按预期进行。但是,当我传递要用作报表数据源的对象时,它试图自动加载相关对象,但失败了。代码创建了一个SqlConnection对象,当我对其调用GetCommand()时,会引发以下异常:

[System.Security.SecurityException] {
"Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."
} System.Security.SecurityException
我已尝试搜索错误,但显示的所有结果都是针对在SQL Server或ASP.Net上运行的CLR程序集。在创建SqlConnection对象之前,我尝试在代码中添加以下调用(如搜索结果中所建议的),但它显然没有做任何事情:

System.Data.SqlClient.SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

有什么想法吗?

一个简单的想法,尽管这不是我见过的错误,但请确保您的断言与设置资源数据源的代码使用相同的方法:

System.Data.SqlClient.SqlClientPermission mPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
try
{
    mPermission.Assert();
    //rest of your code
}
//Handle Exceptions

权限声明不会挂起很长时间,它们可能是一个安全问题,因此尽可能靠近需要它们的代码执行它们是最有可能工作的。

我找到了解决方案。您可以为LocalReport指定System.Security.Policy.Evidence(或具有足够权限的程序集),以便在执行期间使用

reportViewer.LocalReport.ExecuteReportInCurrentAppDomain(System.Reflection.Assembly.GetExecutingAssembly().Evidence);

以防有人像我在搜索此权限错误时一样偶然发现此错误。 我在使用Windows窗体应用程序时出现此错误,因为客户在其计算机上将指向我的应用程序Exe的快捷方式链接为“\COMPUTERNAME\C$\Application.Exe”,而不是“C:\Application.Exe”-这导致System.Security.Permission失败,因为不受信任的intranet使用


有关更多信息,请参见。

除了CuppM的答案之外。 由于.NET4和
LocalReport.SetBasePermissionsForSandboxAppDomain
方法已被弃用,应改用
ExecuteReportInCurrentAppDomain
方法,因为ReportViewer现在始终在沙盒域中执行:

PermissionSet permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
ReportViewer1.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions);

请参阅详细信息。

上面是Artem答案的脚注

我在将Windows身份验证添加到asp.net应用程序时遇到此问题。以框架4.5为目标并使用报告组件11。当我允许匿名用户(在早期开发中)使用ReportViewer时,我没有遇到任何问题。一旦启用Windows auth,我要么在分组表达式时出现“#Error”,要么根本无法运行报告,出现上面列出的异常

我能够解决这个问题,但对Artem发布的内容做了一点修改。除了允许CAS信任沙盒ReportViewer代码的一般意义外,我不完全确定该代码的作用。如有任何评论,请稍加解释

    Dim permissions As PermissionSet = New PermissionSet(PermissionState.Unrestricted)
    myReportViewer.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions)

谢谢你。我刚刚花了5个小时反复思考,试图找出为什么我的报告没有按预期显示。这修复了我的#错误问题。这没有任何区别,唯一有效的方法是在web.config上添加它,这是我不允许做的。这是我的代码现在实际使用的方法,而不是Artem使用的细粒度方法。除了作为一个单独的声明。