Derleme 'system.web, sürüm = 4.0.0.0, kültür = nötr, publickeytoken = b03f5f7f11d50a3a.' SQL kataloğunda bulunamadı


9

System.Web HTTPUtility.UrlDecode yöntemini kullanarak bir SQL CLR işlevi dağıtmaya çalışıyorum ama dağıtmak için alınamıyor. Hata alındı:

Net SqlClient Veri Sağlayıcısı: Msg 6503, Seviye 16, Durum 12, Hat 1 Meclisi 'system.web, sürüm = 4.0.0.0, kültür = nötr, publickeytoken = b03f5f7f11d50a3a.' SQL kataloğunda bulunamadı.

İşlev (SSDT projesinin bir parçası olarak):

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);
    }
}

Bu konu ile ilgili . VS2012 SSDT ve Veritabanı Projesi ile SQL Server 2014'üm. 3, 3.5, 4 ve 4.5 gibi diğer Hedef Çerçeveleri denedim.

Ayrıca, System.Web ile MONTAJ OLUŞTURULDU, ancak daha sonra da başarısız olana kadar Microsoft.Build, System.Xaml gibi diğer derlemeler eklemek zorunda. Ben System.Web listesinde olmayan bakınız Desteklenen Kütüphaneleri herhangi fikirler böylece?

Yanıtlar:


9

Ya kullanabilirsiniz Uri.UnescapeDataString (içinde System) bu durumda da bir yapmak gerekir Replace('+', ' ')ipe önce geçirmeden Uri.UnescapeDataString, yoksa daha çok onunla rahatsız olmaz ise, bu işlev Serbest sürümünde kullanılabilir SQL # (ki ben yazarım).

İthalat System.Web, muhtemelen değerinden daha fazla iştir. Ve aslında, riskli olabilir. System.WebSoruda bağlandığınız "Desteklenen Kitaplıklar" listesinde olmamasının iyi bir nedeni var : Çalışması garanti edilmez! Özellikle ABD dışı ASCII olmayan karakter kümeleriyle uğraşırken, beklendiği gibi çalışmayan durumlarla karşılaşabilirsiniz ve Microsoft bunu düzeltmez. Bu nedenle, kesinlikle gerekmedikçe, desteklenmeyen DLL'leri eklemeye dikkat etmelisiniz. "Desteklenen" listesindeki DLL dosyaları, SQL Server harmanlamalarıyla ve Windows'ta çalışan standart CLR ile SQL Server'ın içinde çalışan CLR arasında farklı olan tüm diğer çevre sorunları ile çalışacak şekilde sınanmış ve doğrulanmıştır.

Microsoft'un desteklenmeyen .NET Framework kitaplıklarını dahil etmenin bazı tuzaklarıyla ilgili bazı ek kaynakları aşağıda bulabilirsiniz:


Kodunuzla ilgili birkaç not:

  1. Lütfen parametreler, giriş veya çıkış için .NET türlerini kullanmayın. Bu nedenle, string encodedXMLolmak SqlString encodedXML.
  2. Bu işlev deterministiktir, bu nedenle böyle işaretlenmelidir, aksi takdirde bir performans isabeti çekersiniz. Ekle IsDeterministic = trueiçin SqlFunctionöznitelik.

8

Belirttiğiniz gibi, System.Webdesteklenmeyen bir kütüphane. Referans System.Webolması için bir arama yapmanız gerekir CREATE ASSEMBLY. Bunu denediniz gibi görünüyor, ama konumuna nasıl başvurdunuz System.Web.dll? Farklı bir konuma kopyaladınız / yapıştırdınız mı? SQL Server, bağımlı derlemeleri aynı konumda bulmaya çalışacaktır. Başka bir deyişle, System.Web.dllaynı dizinde yaşayan tüm bağımlı kitaplıkların konumlarına başvurursanız, düzgün çalışmalıdır. İşte çalışan bir örnek. Hem System.Webmontajı hem de montajınızı ekledim:

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

İstemci iletilerinden SQL Server'ın yüklediği tüm diğer derlemeleri görebilirsiniz. Ancak unutmayın, SQL Server bunların her biri için aşağıdaki uyarıyı görüntüler:

Kayıt yaptıysanız SQL Server tarafından barındırılan ortamda tam olarak test edilmemiştir ve desteklenmemektedir. Gelecekte, bu derlemeyi veya .NET Framework'ü yükseltir veya hizmet verirseniz, CLR tümleştirme yordamınız çalışmayabilir. Daha fazla bilgi için lütfen SQL Server Books Online'a bakın.

Benzer şekilde, ancak ekleyerek System.Web, eklenen aşağıdaki derlemelere bir göz atın:

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

Burada gerçekten neler olduğuna dikkat etmek önemlidir ve diğer ek meclislerin T-SQL giriş noktaları için yolları olmasa da, şimdi bir bağımlılıktır. Gerçekten başvurmanız gerekip gerekmediğiniSystem.Web veya istediğinizi gerçekleştirmek için başka bir yol olup olmadığını görmek için seçenekleri tartarım .


1
Teşekkürler Thomas, işe yaradı. GUI ile komut dosyası System.Web.dll gösteren MONTAJ OLUŞTU çalışıyordu. Bunu bir haber grubu postasına (daha önce bağlantılı) bir cevap olarak deniyordum, bu yüzden bunu kendim kullanmak için yanan bir arzu yok.
wBob

1
@wBob: kesinlikle gerekmedikçe, desteklenmeyen DLL'leri eklemeye dikkat etmelisiniz. System.WebBağlantı kurduğunuz "Desteklenen Kitaplıklar" listesinde yer almamanın iyi bir nedeni vardır : çalışacağı garanti edilmez! . Özellikle ABD dışı ASCII olmayan karakter kümeleriyle uğraşırken, beklendiği gibi çalışmayan durumlarla karşılaşabilirsiniz ve Microsoft bunu düzeltmez. Cevabımda bu konuyla ilgili bir not ekleyeceğim, sadece bilmeyenler için açık olun.
Solomon Rutzky

@srutzky katılıyorum.
wBob

1
Sen bir hayat kurtarıcısın. Bu kütüphaneyi içe aktaramazsam SOL olacaktım. (Bu son derece nadir vakalardan biridir.)
devinbost

5

Bu cevaba göz atın . Sen kullanmak zorunda değilsiniz Uri.UnescapeDataStringya System.Web. Adlı bir sınıf vardır WebUtilityiçinde System.Netfonksiyonları ile HtmlEncodeve HtmlDecode.


Sen işaret olmalıdır WebUtilitySQL Server 2012, 2014 veya daha yeni kullananlar için geçerlidir. Hala SQL Server 2005, 2008 ve 2008 R2'de olanlar, .NET Framework 4.0'da tanıtıldığı için bunu kullanamazlar.
Solomon Rutzky

@srutzky Soru 2014 içindir, ancak kullanıcılara bu sınırlama hakkında bilgi vermek önemlidir. Gönderebileceğim, .NET Framework sürümü ile SQL Server sürümü arasındaki ilişkiyi gösteren bir bağınız var mı?
skeletank

Makalem bugün yayınlandı, bu yüzden şimdi SQL Server sürümleri ile SQLCLR özellikleri (Çerçeve ve CLR sürümleri dahil) arasındaki ilişkiyi gösteren bir grafik var: SQLCLR Seviye 5: Geliştirme (SQL Server içinde .NET Kullanımı ) için merdiven (ücretsiz kayıt gereklidir) ).
Solomon Rutzky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.