【问题标题】:SQL Server can't find my function in my DLL / AssemblySQL Server 在我的 DLL / 程序集中找不到我的函数
【发布时间】: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


【解决方案1】:

问题很微妙,在像这里这样的在线格式中,它甚至看起来只是一个格式问题。但问题完全在这里找到,在方括号内:

AS EXTERNAL NAME ManagedCodeAndSQLServer.[ManagedCodeAndSQLServer.
BaseFunctionClass].GetMessage

ManagedCodeAndSQLServer. 后面有一个不应该存在的实际换行符。它甚至反映在错误消息中:

消息 6505,级别 16,状态 2,过程 usp_UseHelloDotNetAssembly,第 1 行
找不到类型“ManagedCodeAndSQLServer。
程序集“ManagedCodeAndSQLServer”中的 BaseFunctionClass。

这又是一个字眼-
包装;-),但不是。如果删除了换行符,则 T-SQL 如下所示:

AS EXTERNAL NAME ManagedCodeAndSQLServer.[ManagedCodeAndSQLServer.BaseFunctionClass].GetMessage;

那么它就可以正常工作了。

一些补充说明:

  1. 无需授予sa 任何东西。 sysadmin 固定服务器角色的任何成员都已拥有所有权限。
  2. 除了SAFE 之外,不需要将问题中显示的代码标记为任何内容。除非绝对必要,否则请不要将任何程序集标记为 UNSAFE
  3. 无需将数据库设置为TRUSTWORTHY ON。这是一个安全风险,应该避免,除非绝对必要
  4. 如果您正在学习 SQLCLR,请参阅我在 SQL Server Central 上针对该主题撰写的系列文章:Stairway to SQLCLR(需要免费注册才能阅读其内容,但这是值得的 :-)。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 2011-10-29
    • 2011-12-11
    • 2012-05-23
    • 1970-01-01
    • 2015-08-26
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多