繁体   English   中英

SQL Server在我的DLL /程序集中找不到我的函数

[英]SQL Server can't find my function in my DLL / Assembly

您可以使用以下代码在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 Permission Set属性构建了该项目,并使用以下代码将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”。

问题很细微,在这里这样的在线格式中,它甚至似乎只是格式问题。 但问题完全在方括号内找到:

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

ManagedCodeAndSQLServer.之后有一个实际的换行符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上关于该主题的系列文章: SQLCLR的阶梯 (需要免费注册才能阅读其内容,但这是值得的:-)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM