2017-02-17 1 views
1

Я создал класс библиотеки в C# с помощью этого кода вы можете увидеть:SQL Server не может найти свою функцию в моей DLL/сборки

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 

Но я получаю эту ошибку:

Msg 6505, Level 16, State 2, Procedure usp_UseHelloDotNetAssembly, Line 1
Could not find Type 'ManagedCodeAndSQLServer.
BaseFunctionClass' in assembly 'ManagedCodeAndSQLServer'.

+0

@BradleyUffner Я добавил этот код. Его достаточно? Использовать мастер; предоставить доступ к внешнему доступу к [sa]; использовать образецCLR; –

+0

@BradleyUffner спасибо вам, дорогой друг –

+0

Пожалуйста, не используйте 'UNSAFE', нет абсолютно никаких оснований для того, чтобы этот код не был помечен как' SAFE'. Кроме того, вам никогда не нужно предоставлять разрешения для 'sa', поскольку у этого пользователя всегда есть все разрешения. –

ответ

2

Проблема является тонким, и в онлайн-формате, например, здесь, его даже кажется, просто вопрос форматирования. Но этот вопрос полностью находится здесь, в квадратных скобках:

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

Существует фактическая символ новой строки после ManagedCodeAndSQLServer., что там не должно быть. Это даже отражено в сообщении об ошибке:

Msg 6505, Level 16, State 2, Procedure usp_UseHelloDotNetAssembly, Line 1
Could not find Type 'ManagedCodeAndSQLServer.
BaseFunctionClass' in assembly 'ManagedCodeAndSQLServer'.

который снова выглядит как само собой слова-
упаковки ;-), но это не так. Если новая строка удалена так, что T-SQL выглядит следующим образом:

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

тогда это будет работать нормально.

Некоторые дополнительные примечания:

  1. Нет необходимости постоянно предоставлять sa ничего. Любой член фиксированной серверной роли уже имеет все разрешения.
  2. Код не указан в вопросе, который обозначается как ничего, кроме SAFE. Пожалуйста, не отмечайте никакую сборку как UNSAFE, если это абсолютно необходимо.
  3. Нет необходимости устанавливать базу данных в TRUSTWORTHY ON. Это риск для безопасности, и его следует избегать, если не требуется .
  4. Если вы изучаете SQLCLR, см. Серию, которую я пишу по этой теме в SQL Server Central: Stairway to SQLCLR (бесплатная регистрация требуется для чтения их содержимого, но это того стоит :-).
Смежные вопросы