【发布时间】:2017-07-07 06:03:38
【问题描述】:
如您所见,我使用此代码在 C# 中创建了一个库类:
namespace ManagedCodeAndSQLServer
{
public class BaseFunctionClass
{
public BaseFunctionClass()
{
}
[SqlProcedure]
public static void GetMessage(SqlString strName, out SqlString
strMessge)
{
strMessge = "Welcome," + strName + ", " + "your code is getting executed under CLR !";
}
}
}
我使用 UNSAFE 权限集属性构建了这个项目,并使用以下代码将 DLL 添加到 SQL Server:
use master;
grant external access assembly to [sa];
use SampleCLR;
CREATE ASSEMBLY ManagedCodeAndSQLServer
AUTHORIZATION dbo
FROM 'd:\ManagedCodeAndSQLServer.dll'
WITH PERMISSION_SET = UNSAFE
GO
它将程序集添加为我的数据库的一部分。
我想调用你看到的函数:
CREATE PROCEDURE usp_UseHelloDotNetAssembly
@name nvarchar(200),
@msg nvarchar(MAX)OUTPUT
AS EXTERNAL NAME ManagedCodeAndSQLServer.[ManagedCodeAndSQLServer.
BaseFunctionClass].GetMessage
GO
但我收到此错误:
消息 6505,级别 16,状态 2,过程 usp_UseHelloDotNetAssembly,第 1 行
找不到类型“ManagedCodeAndSQLServer。
程序集“ManagedCodeAndSQLServer”中的 BaseFunctionClass。
【问题讨论】:
-
@BradleyUffner 我添加了这段代码。够了吗?使用大师;向 [sa] 授予外部访问程序集;使用 SampleCLR;
-
@BradleyUffner 谢谢你亲爱的朋友
-
我要删除我的 cmets,因为比我更了解 sql 安全性的人说我的建议是安全风险。我不想给任何人不好的建议。
-
仅供参考:对于这些 cmets,您可以将代码括在单个反引号中以获得更好的
formatting:)。另外,我刚刚看了那篇文章,它是可怕的。它应该从 codeproject 中删除。请忘记你曾经看过它。如果您正在学习 SQLCLR,请参阅我在 SQL Server Central 上针对该主题撰写的系列文章:Stairway to SQLCLR(需要免费注册才能阅读其内容)。我正在我的系统上尝试您的代码。会让你知道的。 -
好的,所以我从这里简单复制并粘贴了您的代码。当我执行 T-SQL 时,我得到了同样的错误。然后我注意到,当我复制和粘贴时,它在命名空间名称和用方括号括起来的类名称之间保留了换行符。我删除了换行符,所以它显示为
[ManagedCodeAndSQLServer.BaseFunctionClass]并且它有效。我假设您的 SQL 中的换行符,甚至错误消息中的换行符都是在 S.O. 上完成的格式化。但看起来它确实存在于您的代码中。删除换行符,它应该可以工作。如果是这样,我会发布一个答案。
标签: c# .net sql-server .net-assembly sqlclr