Асамблея 'system.web, версія = 4.0.0.0, культура = нейтральна, publickeytoken = b03f5f7f11d50a3a.' не знайдено в каталозі SQL


9

Я намагаюся розгорнути функцію SQL CLR за допомогою методу HTTPUtility.UrlDecode System.Web, але я не можу змусити його розгорнутись. Помилка отримана:

.Net Постачальник даних SqlClient: Msg 6503, рівень 16, стан 12, рядок 1 Асамблея 'system.web, версія = 4.0.0.0, культура = нейтральна, publickeytoken = b03f5f7f11d50a3a.' не знайдено в каталозі SQL.

Функція (як частина проекту SSDT):

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
    public static SqlString udf_UrlDecode(SqlString encodedXML)
    {
        string decodedXML;

        decodedXML = HttpUtility.UrlDecode(encodedXML.ToString());

        return new SqlString(decodedXML);
    }
}

Це стосовно цієї нитки . Я SQL Server 2014 із VS2012 SSDT та проектними базами даних. Спробували з іншими цільовими рамками, наприклад 3, 3,5, 4 та 4.5.

Я також спробував CREATE ASSEMBLY з System.Web, але потім додати інші збірки, наприклад Microsoft.Build, System.Xaml, поки вони також не завершаться. Я бачу System.Web не в списку підтримуваних бібліотек, тому будь-які ідеї?

Відповіді:


9

Ви можете або скористатися Uri.UnescapeDataString (in System), і в цьому випадку вам також потрібно буде виконати a Replace('+', ' ')на рядку перед тим, як передати його Uri.UnescapeDataString, або, якщо ви не хочете з цим заважати, ця функція доступна у безкоштовній версії SQL # (якому я є автором).

Імпорт System.Web- це, мабуть, більше роботи, ніж варто. А насправді це може бути ризиковано. Є вагома причина, що System.Webнемає у списку "Бібліотеки, що підтримуються", до якого ви зв'язалися у запитанні: це не гарантується! Ви можете зіткнутися з ситуаціями, особливо коли маєте справу з наборами символів ASCII, які не є США, які не ведуть себе так, як очікувалося, і Microsoft не виправить це. Отже, якщо вам абсолютно не доведеться, слід бути обережними щодо додавання DLL-файлів, що не підтримуються. DLL у списку "Підтримувані" були повністю перевірені та перевірені для роботи із зіставленнями SQL Server та будь-якими іншими екологічними проблемами, які відрізняються між стандартними CLR, що працюють у Windows, та CLR, що працюють у SQL Server.

Ось кілька додаткових ресурсів від Microsoft щодо кількох підводних каменів щодо включення непідтримуваних бібліотек .NET Framework:


Кілька приміток про ваш код:

  1. Будь ласка, не використовуйте типи .NET для параметрів, вводу або виводу. Отже, зміни string encodedXMLбути SqlString encodedXML.
  2. Ця функція є детермінованою, тому її слід позначати як таку, інакше ви постраждаєте від ефективності. Додати IsDeterministic = trueв SqlFunctionатрибут.

8

Як ви вже зазначали, System.Webце непідтримувана бібліотека. Для посилання System.Webвам потрібно зателефонувати CREATE ASSEMBLY. Здається, ви намагалися це зробити, але як ви вказали місце розташування System.Web.dll? Ви скопіювали / вставили його в інше місце? SQL Server намагатиметься знайти залежні збірки в одному місці. Іншими словами, якщо ви посилаєтесь на розташування System.Web.dllвсіх інших залежних бібліотек, що живуть у тому самому каталозі, це повинно працювати добре. Ось робочий приклад. Я зміг додати як System.Webзбірку, так і вашу збірку:

create assembly [System.Web]
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll'
with permission_set = unsafe;
go

create assembly SystemWebTest
from 'c:\SqlServer\SystemWebTest.dll'
with permission_set = safe;
go

Ви можете побачити з клієнтських повідомлень усі інші збірки, які завантажує SQL Server. Але зауважте, SQL Server відображає таке попередження для кожного з них:

ви реєструєтеся не повністю перевірені в середовищі розміщення SQL Server і не підтримуються. Надалі, якщо ви оновите або обслуговуєте цю збірку або .NET Framework, ваша програма інтеграції CLR може припинити роботу. Для отримання детальної інформації зверніться до книг SQL Server Books Online.

Аналогічно, але додаючи System.Web, подивіться на наступні складання, які додаються:

select
    name,
    permission_set_desc,
    is_visible
from sys.assemblies
where is_user_defined = 1
order by is_visible desc;

name                                            permission_set_desc is_visible
System.Web                                      UNSAFE_ACCESS       1
SystemWebTest                                   SAFE_ACCESS         1
Microsoft.Build.Framework                       UNSAFE_ACCESS       0
System.Xaml                                     UNSAFE_ACCESS       0
System.ComponentModel.DataAnnotations           UNSAFE_ACCESS       0
System.Runtime.Caching                          UNSAFE_ACCESS       0
System.Web.ApplicationServices                  UNSAFE_ACCESS       0
System.Drawing                                  UNSAFE_ACCESS       0
Microsoft.Build.Utilities.v4.0                  UNSAFE_ACCESS       0
System.DirectoryServices                        UNSAFE_ACCESS       0
System.DirectoryServices.Protocols              UNSAFE_ACCESS       0
System.EnterpriseServices                       UNSAFE_ACCESS       0
System.Runtime.Remoting                         UNSAFE_ACCESS       0
System.Runtime.Serialization.Formatters.Soap    UNSAFE_ACCESS       0
System.Design                                   UNSAFE_ACCESS       0
System.Windows.Forms                            UNSAFE_ACCESS       0
Accessibility                                   UNSAFE_ACCESS       0
System.Drawing.Design                           UNSAFE_ACCESS       0
System.Web.RegularExpressions                   UNSAFE_ACCESS       0
Microsoft.Build.Tasks.v4.0                      UNSAFE_ACCESS       0
System.ServiceProcess                           UNSAFE_ACCESS       0
System.Configuration.Install                    UNSAFE_ACCESS       0
System.Runtime.Serialization                    UNSAFE_ACCESS       0
System.ServiceModel.Internals                   UNSAFE_ACCESS       0
SMDiagnostics                                   UNSAFE_ACCESS       0

Варто пам’ятати про те, що насправді відбувається тут, і хоча інші додаткові збірки не мають способів для вхідних точок T-SQL, вони тепер залежність. Я зважую варіанти, щоб побачити, чи справдіSystem.Web вам потрібно посилатись , чи є інший маршрут для досягнення того, що ви хочете.


1
Дякую Томасу, що спрацювало. Я намагався CREATE ASSEMBLY вказувати на System.Web.dll сценарій через GUI. Я експериментував з цим як відповідь на публікацію в групі новин (зв'язаний раніше), тому немає гострого бажання використовувати її самостійно.
wBob

1
@wBob: якщо вам абсолютно не доведеться, слід бути обережними щодо додавання DLL-файлів, що не підтримуються. Є вагома причина, що System.Webнемає у списку "Бібліотеки, що підтримуються", до якого ви пов’язали: робота не гарантована! . Ви можете зіткнутися з ситуаціями, особливо коли маєте справу з наборами символів ASCII, які не є США, які не ведуть себе так, як очікувалося, і Microsoft не виправить це. Я додам записку про це у своїй відповіді, щоб бути зрозумілим для тих, хто може не знати.
Соломон Руцький

@srutzky Я згоден.
wBob

1
Ви рятувальник життя. Я збирався стати SOL, якщо не зміг імпортувати цю бібліотеку. (Це один із тих надзвичайно рідкісних випадків.)
devinbost

5

Перевірте цю відповідь . Ви не повинні використовувати Uri.UnescapeDataStringабо System.Web. Існує клас, який називається WebUtilityвсередині System.Netз функціями HtmlEncodeта HtmlDecode.


Слід зазначити, що WebUtilityвін доступний лише тим, хто використовує SQL Server 2012, 2014 або новіші. Ті, хто все ще перебуває на SQL Server 2005, 2008 та 2008 R2, не зможуть використовувати це через те, що він був представлений у .NET Framework 4.0.
Соломон Руцький

@srutzky Питання стосується 2014 року, але важливо повідомити користувачів про це обмеження. Чи є у вас посилання, яку я можу опублікувати, що показує зв’язок між версією .NET Framework та версією SQL Server?
скелет

Моя стаття була опублікована сьогодні, тому зараз існує діаграма, що показує взаємозв'язок між версіями SQL Server та функціями SQLCLR (включаючи версії Framework та CLR): Stairway to SQLCLR 5 рівень: Розвиток (Використання .NET в SQL Server) (потрібна безкоштовна реєстрація ).
Соломон Руцький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.