it-swarm.com.de

Assembly 'system.web, Version = 4.0.0.0, Kultur = neutral, publickeytoken = b03f5f7f11d50a3a.' wurde nicht im SQL-Katalog gefunden

Ich versuche, eine SQL CLR-Funktion mithilfe der HTTPUtility.UrlDecode-Methode von System.Web bereitzustellen, kann sie jedoch nicht bereitstellen. Fehler erhalten:

.Net SqlClient-Datenprovider: Nachricht 6503, Ebene 16, Status 12, Zeile 1 Assembly 'system.web, Version = 4.0.0.0, Kultur = neutral, publickeytoken = b03f5f7f11d50a3a.' wurde nicht im SQL-Katalog gefunden.

Die Funktion (als Teil des SSDT-Projekts):

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

Es ist in Bezug auf diese Thread . Ich bin SQL Server 2014 mit VS2012 SSDT und Datenbankprojekt. Habe es mit anderen Target Frameworks versucht, zB 3, 3.5, 4 und 4.5.

Ich habe auch versucht, Assembly mit System.Web zu erstellen, muss dann aber andere Assemblys hinzufügen, z. B. Microsoft.Build, System.Xaml, bis sie ebenfalls fehlschlagen. Ich sehe, dass System.Web nicht auf der Liste von nterstützte Bibliotheken steht. Also irgendwelche Ideen?

9
wBob

Sie können entweder ri.UnescapeDataString (in System) verwenden. In diesem Fall müssen Sie auch eine Replace('+', ' ') für die Zeichenfolge vor Übergabe an Uri.UnescapeDataString, oder wenn Sie sich lieber nicht darum kümmern möchten, ist diese Funktion in der kostenlosen Version von SQL # (deren Autor ich bin) verfügbar.

Importieren von System.Web ist wahrscheinlich mehr Arbeit als es wert ist. Und in der Tat kann es riskant sein. Es gibt einen guten Grund, dass System.Web befindet sich nicht in der Liste "Unterstützte Bibliotheken", auf die Sie in der Frage verwiesen haben: Es funktioniert nicht garantiert! Sie könnten auf Situationen stoßen, insbesondere wenn es sich um Nicht-US-Zeichensätze handelt ASCII-Zeichensätze, die sich nicht wie erwartet verhalten, und Microsoft wird dies nicht beheben. Es sei denn, Sie müssen absolut sollten Sie vorsichtig sein, wenn Sie nicht unterstützte DLLs hinzufügen. Die DLLs in der Liste "Unterstützt" wurden vollständig getestet und überprüft, um mit SQL Server-Kollatierungen und anderen Umgebungsproblemen zu funktionieren, die sich zwischen der in Windows ausgeführten Standard-CLR und der in SQL Server ausgeführten CLR unterscheiden.

Im Folgenden finden Sie einige zusätzliche Ressourcen von Microsoft zu verschiedenen Fallstricken bei der Integration nicht unterstützter .NET Framework-Bibliotheken:


Ein paar Anmerkungen zu Ihrem Code:

  1. Bitte verwenden Sie keine .NET-Typen für Parameter, Eingabe oder Ausgabe. Ändern Sie daher string encodedXML sein SqlString encodedXML.
  2. Diese Funktion ist deterministisch und sollte daher als solche gekennzeichnet werden, da Sie sonst einen Leistungseinbruch erleiden. Hinzufügen IsDeterministic = true zum SqlFunction Attribut.
9
Solomon Rutzky

Wie Sie bemerkt haben, ist System.Web Eine nicht unterstützte Bibliothek. Um auf System.Web Zu verweisen, müssen Sie CREATE Assembly Aufrufen. Anscheinend haben Sie das versucht, aber wie haben Sie auf den Speicherort von System.Web.dll Bezug genommen? Haben Sie es an einen anderen Ort kopiert/eingefügt? SQL Server versucht, abhängige Assemblys am selben Speicherort zu finden. Mit anderen Worten, wenn Sie auf den Speicherort von System.Web.dll Mit allen anderen abhängigen Bibliotheken verweisen, die sich im selben Verzeichnis befinden, sollte dies einwandfrei funktionieren. Hier ist ein Arbeitsbeispiel. Ich konnte sowohl die System.Web - Assembly als auch Ihre Assembly hinzufügen:

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

In den Clientnachrichten können Sie alle anderen Assemblys sehen, die SQL Server lädt. Beachten Sie jedoch, dass SQL Server für jede dieser Funktionen die folgende Warnung anzeigt:

die Registrierung wird in der von SQL Server gehosteten Umgebung nicht vollständig getestet und nicht unterstützt. Wenn Sie diese Assembly oder .NET Framework in Zukunft aktualisieren oder warten, funktioniert Ihre CLR-Integrationsroutine möglicherweise nicht mehr. Weitere Informationen finden Sie in den SQL Server-Onlinedokumenten.

Wenn Sie jedoch System.Web Hinzufügen, sehen Sie sich die folgenden hinzugefügten Assemblys an:

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

Es lohnt sich, sich darüber im Klaren zu sein, was hier tatsächlich passiert, und obwohl die anderen zusätzlichen Assemblys keine Möglichkeiten für T-SQL-Einstiegspunkte haben, sind sie es sind jetzt eine Abhängigkeit. Ich würde die Optionen abwägen, um zu sehen, ob Sie wirklich auf System.Web verweisen müssen oder ob es eine andere gibt Route, um das zu erreichen, was Sie wollen.

8
Thomas Stringer

Check out diese Antwort . Sie müssen nicht Uri.UnescapeDataString Oder System.Web Verwenden. Innerhalb von System.Net Gibt es eine Klasse namens WebUtility mit den Funktionen HtmlEncode und HtmlDecode.

5
skeletank