Hội 'system.web, phiên bản = 4.0.0.0, văn hóa = trung tính, publickeytoken = b03f5f7f11d50a3a.' không tìm thấy trong danh mục SQL


9

Tôi đang cố gắng triển khai hàm SQL CLR bằng phương thức HTTPUtility.UrlDecode của System.Web nhưng tôi không thể triển khai nó. Lỗi nhận được:

Nhà cung cấp dữ liệu SNetClient không tìm thấy trong danh mục SQL.

Chức năng (như một phần của dự án 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);
    }
}

Nó liên quan đến chủ đề này . Tôi là SQL Server 2014 với VS2012 SSDT và Dự án cơ sở dữ liệu. Đã thử với các Khung mục tiêu khác, ví dụ 3, 3.5, 4 và 4.5.

Tôi cũng đã thử TẠO ASSEMBLY với System.Web, nhưng sau đó phải thêm các hội đồng khác, ví dụ Microsoft.Build, System.Xaml cho đến khi chúng cũng thất bại. Tôi thấy System.Web không có trong danh sách các Thư viện được hỗ trợ nên có ý tưởng nào không?

Câu trả lời:


9

Bạn có thể sử dụng Uri.UnescapeDataString (in System), trong trường hợp đó bạn cũng sẽ cần phải thực hiện một Replace('+', ' ')chuỗi trên trước khi chuyển nó tới Uri.UnescapeDataString, hoặc nếu bạn không muốn làm phiền với nó, chức năng này có sẵn trong phiên bản SQL # miễn phí (mà tôi là tác giả của).

Nhập khẩu System.Webcó lẽ là công việc nhiều hơn giá trị của nó. Và trên thực tế, nó có thể có rủi ro. Có một lý do chính đáng System.Webkhông nằm trong danh sách "Thư viện được hỗ trợ" mà bạn đã liên kết trong câu hỏi: nó không được đảm bảo để hoạt động! Bạn có thể gặp phải các tình huống, đặc biệt là khi xử lý các bộ ký tự ASCII không phải của Hoa Kỳ, không hoạt động như mong đợi và Microsoft sẽ không khắc phục nó. Vì vậy, trừ khi bạn hoàn toàn phải làm, bạn nên cẩn thận về việc thêm các DLL không được hỗ trợ. Các DLL trong danh sách "Được hỗ trợ" đã được kiểm tra và xác minh đầy đủ để hoạt động với các đối chiếu SQL Server và bất kỳ vấn đề môi trường nào khác giữa CLR tiêu chuẩn chạy trong Windows và CLR chạy bên trong SQL Server.

Dưới đây là một số tài nguyên bổ sung từ Microsoft liên quan đến một số cạm bẫy để kết hợp các thư viện .NET Framework không được hỗ trợ:


Một vài lưu ý về mã của bạn:

  1. Vui lòng không sử dụng các loại .NET cho các tham số, đầu vào hoặc đầu ra. Do đó, thay đổi string encodedXMLđể được SqlString encodedXML.
  2. Hàm này mang tính quyết định vì vậy nên được đánh dấu như vậy, nếu không bạn sẽ phải chịu một cú đánh hiệu suất. Thêm IsDeterministic = truevào SqlFunctionthuộc tính.

8

Như bạn đã lưu ý, System.Weblà một thư viện không được hỗ trợ. Để tham khảo, System.Webbạn sẽ cần phải thực hiện một cuộc gọi đến CREATE ASSEMBLY. Có vẻ như bạn đã thử điều đó, nhưng làm thế nào bạn tham khảo vị trí của System.Web.dll? Bạn đã sao chép / dán nó vào một vị trí khác? SQL Server sẽ cố gắng xác định vị trí các cụm phụ thuộc trong cùng một vị trí. Nói cách khác, nếu bạn tham chiếu vị trí của System.Web.dllvới tất cả các thư viện phụ thuộc khác sống trong cùng một thư mục, thì nó sẽ hoạt động tốt. Dưới đây là một ví dụ làm việc. Tôi đã có thể thêm cả System.Weblắp ráp cũng như lắp ráp của bạn:

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

Bạn có thể thấy từ các thông điệp máy khách tất cả các hội đồng khác mà SQL Server tải. Nhưng hãy lưu ý, SQL Server hiển thị cảnh báo sau cho từng trường hợp sau:

bạn đang đăng ký không được kiểm tra đầy đủ trong môi trường lưu trữ SQL Server và không được hỗ trợ. Trong tương lai, nếu bạn nâng cấp hoặc bảo trì tổ hợp này hoặc .NET Framework, thói quen tích hợp CLR của bạn có thể ngừng hoạt động. Vui lòng tham khảo SQL Server Books Online để biết thêm chi tiết.

Tương tự như vậy, nhưng thêm vào System.Web, hãy xem các hội đồng sau đây được thêm vào:

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

Điều đáng lưu tâm về những gì đang thực sự xảy ra ở đây và mặc dù các hội đồng bổ sung khác không có cách nào cho các điểm nhập T-SQL, giờ đây chúng là một phần phụ thuộc. Tôi sẽ cân nhắc các tùy chọn để xem nếu bạn thực sự cần tham khảoSystem.Web , hoặc nếu có một tuyến đường khác để thực hiện những gì bạn muốn.


1
Cảm ơn Thomas, điều đó đã làm việc. Tôi đã thử TẠO ASSEMBLY chỉ vào System.Web.dll theo kịch bản thông qua GUI. Tôi đã thử nghiệm điều này như một câu trả lời cho một bài đăng nhóm tin tức (được liên kết trước đó), vì vậy không có mong muốn cháy bỏng để sử dụng nó cho mình.
wBob

1
@wBob: trừ khi bạn hoàn toàn phải làm, bạn nên cẩn thận về việc thêm các DLL không được hỗ trợ. Có một lý do chính đáng System.Webkhông nằm trong danh sách "Thư viện được hỗ trợ" mà bạn liên kết đến: nó không được đảm bảo để hoạt động! . Bạn có thể gặp phải các tình huống, đặc biệt là khi xử lý các bộ ký tự ASCII không phải của Hoa Kỳ, không hoạt động như mong đợi và Microsoft sẽ không khắc phục nó. Tôi sẽ thêm một lưu ý về điều này trong câu trả lời của tôi chỉ để rõ ràng cho những người có thể không biết.
Solomon Rutzky

@srutzky Tôi đồng ý.
wBob

1
Bạn là một người cứu rỗi cuộc sống. Tôi sẽ trở thành SOL nếu tôi không thể nhập thư viện này. (Đây là một trong những trường hợp cực kỳ hiếm gặp.)
devinbost

5

Kiểm tra câu trả lời này . Bạn không phải sử dụng Uri.UnescapeDataStringhoặc System.Web. Có một lớp được gọi WebUtilitybên trong System.Netvới các hàm HtmlEncodeHtmlDecode.


Bạn nên chỉ ra rằng WebUtilitychỉ có sẵn cho những người sử dụng SQL Server 2012, 2014 hoặc mới hơn. Những người vẫn còn trên SQL Server 2005, 2008 và 2008 R2 sẽ không thể sử dụng điều này do được giới thiệu trong .NET Framework 4.0.
Solomon Rutzky

@srutzky Câu hỏi là cho năm 2014 nhưng điều quan trọng là phải cho người dùng biết về giới hạn này. Bạn có một liên kết mà tôi có thể đăng tải cho thấy mối quan hệ giữa phiên bản .NET Framework và phiên bản SQL Server không?
skeletank 3/2/2015

Bài viết của tôi đã được xuất bản ngày hôm nay vì vậy hiện có một biểu đồ cho thấy mối quan hệ giữa các phiên bản SQL Server và các tính năng SQLCLR (bao gồm cả phiên bản Framework và CLR): Stairway to SQLCLR Cấp 5: Phát triển (Sử dụng .NET trong SQL Server) (bắt buộc phải đăng ký miễn phí ).
Solomon Rutzky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.