Ошибка CLR в SQL Server 2017: невозможно найти тип в сборке - PullRequest
1 голос
/ 11 декабря 2019

Я создаю хранимую процедуру CLR в SQL Server 2017. Я делал это много раз в предыдущих версиях без каких-либо проблем;тем не менее, мы недавно обновились до SQL Server 2017.

Я знаю о проблемах безопасности, связанных с этим обновлением, но я хотел убедиться, что смогу развернуть свой CLR до того, как начну возиться с безопасностью. Я создал базу данных с именем Test и установил Trustworthy на ON (плохо, я знаю - временно). Я продолжаю получать следующую ошибку:

Не удалось найти тип 'CLR_Get_API_Data.StoredProcedures' в сборке 'Get_API_Data'.

Я нашел несколько статей, например: SQLСервер: Не удалось найти тип в сборке , которая имела дело с этой ошибкой, но они создали свой код в классе, а не в частичном классе типа storedProcedures.

Это мой сценарий SQL для созданияхранимая процедура:

USE Test 
GO

--Alter Database Test
--Set Trustworthy on

--EXEC sp_configure 'clr strict security', 1;
--RECONFIGURE;

IF EXISTS (SELECT * FROM sys.assemblies asms 
           WHERE asms.name = N'Get_API_Data' AND is_user_defined = 1)
    DROP ASSEMBLY [Get_API_Data]
GO

CREATE ASSEMBLY Get_API_Data
FROM 'C:\Users\Administrator\Documents\Visual Studio 2015\Projects\CLR_Assemblies\Get_API_Data\Get_API_Data\bin\Debug\Get_API_Data.dll'
WITH Permission_Set = Safe --EXTERNAL_ACCESS 
GO

--Assembly Name,[SolutionName.StoredProcedures].Sub Name
CREATE PROCEDURE [dbo].[GetAPI]
AS EXTERNAL NAME Get_API_Data.[CLR_Get_AMS_API_Data.StoredProcedures].GetAPI
GO

Имя моего решения CLR_Get_API_Data, имя моего проекта Get_API_Data, имя метода GetAPI. Ниже приведен мой код Visual Studio:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Net;
using System.IO;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void GetAPI ()
    {
         // Stuff happens here
    }    //Ends Public Void Get
}    //Ends Class

1 Ответ

0 голосов
/ 11 декабря 2019

Нет ничего плохого в использовании частичного класса.

Часть CLR_Get_AMS_API_Data в [CLR_Get_AMS_API_Data.StoredProcedures] относится к имени пространства имен. Ваш код не показывает, что вы используете пространство имен. Удалите CLR_Get_AMS_API_Data., чтобы у вас остались:

AS EXTERNAL NAME Get_API_Data.[StoredProcedures].GetAPI

Для получения дополнительной информации о правильном / безопасном развертывании проектов SQLCLR в SQL Server 2017 и новее см. Мои сообщения:

  1. SQLCLR против SQL Server 2017, часть 2: «строгая безопасность CLR» - решение 1 - больше шагов, чем в части 3, решение 2 (ниже), но хорошо подходит для существующих проектов, так какон почти не требует изменений в существующем решении или даже в процессе развертывания (и на самом деле это фактически тот путь, по которому я пошел для своего проекта SQL # , так как все, что он сделал, - это добавление 3 простых шагов к началусценарий установки)
  2. SQLCLR против SQL Server 2017, часть 3: «Строгая безопасность CLR» - решение 2

Для получения дополнительной информации о работе с SQLCLRв общем, пожалуйста, посетите: SQLCLR Info

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...