关于System.Data.SqlClient.SqlClientPermission的一个异常

calories 2006-05-30 09:53:33
使用ASP.net 2.0,用C#定义了一个SQL存储过程(Submit_Answer),然后将dll在SQL Server中注册了。但是在程序中调用这个存储过程时,出现了下面所示的异常。从堆栈信息可以看出,是刚刚进入存储过程后打开数据库连接时出的错,也就是说该存储过程里面对数据库操作没有权限,对么?应该怎么解决这个问题呢?

请大家指教,谢谢!我是初学,可能有描述不太专业的地方,还请大家多多包涵。

***************************
异常信息及堆栈信息摘录如下:
***************************

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: A .NET Framework error occurred during execution of user defined routine or aggregate 'Submit_Answer':
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:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at StoredProcedures.Submit(SqlChars strAnswer)
...全文
671 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
calories 2006-05-31
  • 打赏
  • 举报
回复
我把代码粘上来,恳请大家指教,非常感谢!

使用ASP.net 2.0,用C#写了一个存储过程,对数据库test中的一个表进行操作,代码如下:
public class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void Submit(SqlChars strAnswer)
{
using (SqlConnection connection = new SqlConnection("Data Source=WS;Initial Catalog=test;Integrated Security=False;Trusted_Connection=yes;"))
{
connection.Open(); // ***执行到这一步出现异常,如下文所述***
String cmdTxt = "INSERT INTO dbo.Response_RCL90 VALUES(" + strAnswer + ")";
SqlCommand command = new SqlCommand(cmdTxt, connection);
SqlDataReader reader = command.ExecuteReader();

}
}
}

编译生成了Submit_Answer.dll,接着,在SQL Server中注册这个dll,并创建存储过程,SQL脚本如下:

CREATE ASSEMBLY Submit_Answer
FROM 'D:\study\C#\测评系统\WebSite1\StoredProcedure\Submit_Answer\bin\Debug\Submit_Answer.dll';
GO

CREATE PROCEDURE dbo.Submit_Answer
(
@strAnswer nvarchar(256)
)
WITH EXECUTE AS OWNER
AS
EXTERNAL NAME Submit_Answer.StoredProcedures.Submit
GO

然后,在.net中调用这个存储过程,代码如下:
SqlConnection connection = new SqlConnection("Data Source=WS;Initial Catalog=test;Integrated Security=False;Trusted_Connection=yes;");

String cmdTxt = "dbo.Submit_Answer";
SqlCommand command = new SqlCommand(cmdTxt, connection);
command.CommandType = CommandType.StoredProcedure;

command.Parameters.Add("@strAnswer", SqlDbType.NVarChar);
command.Parameters["@strAnswer"].Value = strAnswer;

command.Connection.Open();
SqlDataReader dr = command.ExecuteReader();

command.Connection.Close();

但是在执行到存储过程里面"connection.Open();"时,出现异常,异常及堆栈信息如下:

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: A .NET Framework error occurred during execution of user defined routine or aggregate 'Submit_Answer':
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:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at StoredProcedures.Submit(SqlChars strAnswer)
.

源错误:

行 86:
行 87: command.Connection.Open();
行 88: SqlDataReader dr = command.ExecuteReader();
行 89:
行 90: command.Connection.Close();


源文件: d:\study\C#\测评系统\WebSite1\Testing.aspx.cs 行: 88
dgrwang 2006-05-31
  • 打赏
  • 举报
回复
mark
ilovejolly 2006-05-31
  • 打赏
  • 举报
回复
mark
calories 2006-05-31
  • 打赏
  • 举报
回复
按照“MS-SQL Server 疑难问题”版上 zlp321002(龙卷风2006) 的方法把这个问题解决了,现在摘录他的帖子如下,大家共同研究一下:

非常感谢 zlp321002(龙卷风2006) 的帮助
也感谢上面各位的帮助和关注,谢谢大家

摘录zlp321002(龙卷风2006)的帖子如下:


回复人:zlp321002(龙卷风2006) ( 三星(高级)) 信誉:104 2006-5-31 10:29:38 得分:50
?

--是不是没有访问外部资源的权限. 我在处理CLR的时候也遇到过此问题.

CREATE ASSEMBLY Submit_Answer
FROM 'D:\study\C#\测评系统\WebSite1\StoredProcedure\Submit_Answer\bin\Debug\Submit_Answer.dll';
GO
--改为:

CREATE ASSEMBLY Submit_Answer
FROM 'D:\study\C#\测评系统\WebSite1\StoredProcedure\Submit_Answer\bin\Debug\Submit_Answer.dll';
GO
WITH PERMISSION_SET = UNSAFE
GO


1: 启用数据库CLR支持
--***********************************************
EXEC sp_configure 'show advanced options','1';
go
reconfigure;
go
EXEC sp_configure 'clr enabled','1'
go
--***********************************************
2: 更改数据库信任模式(为正确添加到程序集)
TRUSTWORTHY { ON | OFF }
ON
使用模拟上下文的数据库模块(例如,用户定义函数或存储过程)可以访问数据库以外的资源。

OFF
模拟上下文中的数据库模块不能访问数据库以外的资源。
--***********************************************
Alter Database 数据库名称
SET TRUSTWORTHY ON
--***********************************************
calories 2006-05-30
  • 打赏
  • 举报
回复
谢谢您的回答,但是能不能解释一下,我不太明白是什么意思。谢谢!
lazyfish 2006-05-30
  • 打赏
  • 举报
回复
dbo.Submit_Answer

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧