web-dev-qa-db-ja.com

アセンブリ 'system.web、バージョン= 4.0.0.0、カルチャ=ニュートラル、publickeytoken = b03f5f7f11d50a3a。' SQLカタログで見つかりませんでした

System.WebのHTTPUtility.UrlDecodeメソッドを使用してSQL CLR関数をデプロイしようとしていますが、デプロイできません。受け取ったエラー:

.Net SqlClientデータプロバイダー:メッセージ6503、レベル16、状態12、行1アセンブリ 'system.web、version = 4.0.0.0、culture = neutral、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);
    }
}

これは thread に関連しています。私はVS2012 SSDTとデータベースプロジェクトを備えたSQL Server 2014です。他のターゲットフレームワーク(3、3.5、4、4.5など)で試した。

また、System.WebでCREATE Assemblyを試しましたが、失敗するまでMicrosoft.Build、System.Xamlなどの他のアセンブリを追加する必要があります。 System.Webが Supported Libraries のリストにないので、アイデアはありますか?

9
wBob

ri.UnescapeDataStringSystem内)を使用することもできます。その場合、文字列に対してReplace('+', ' ')も実行する必要がありますbefore Uri.UnescapeDataStringに渡すか、または気にしない場合、この関数は無料バージョンの SQL# で使用できます(これは私が作者です) )。

System.Webのインポートは、おそらくそれ以上の作業になります。そして実際には、それは危険を伴う可能性があります。質問でリンクした「サポートされているライブラリ」リストにSystem.Webが含まれていないことには十分な理由があります:動作が保証されていません!特にUS以外のASCII文字セットを処理する場合、期待どおりに動作せず、Microsoftが修正しない)状況に遭遇する可能性があります。したがって、絶対にする必要があります。サポートされていないDLLを追加する場合は注意が必要です。「サポートされている」リストのDLLは、SQL Server照合およびその他の環境問題で機能するように完全にテストおよび検証されていますWindowsで実行されている標準のCLRとSQL Server内で実行されているCLRとは異なります。

サポートされていない.NET Frameworkライブラリを組み込むためのいくつかの落とし穴に関するMicrosoftからの追加リソースがあります。


コードに関する注意事項:

  1. パラメータ、入力、または出力に.NETタイプを使用しないでください。したがって、string encodedXMLSqlString encodedXMLに変更します。
  2. この関数は確定的であるため、そのようにマークする必要があります。そうしないと、パフォーマンスヒットが発生します。 SqlFunction属性にIsDeterministic = trueを追加します。
9
Solomon Rutzky

お気づきのように、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

ここで実際に何が起こっているかについて注意する価値があります。other追加のアセンブリにT-SQLエントリポイントの方法がない場合でも、今は依存関係です。 本当にSystem.Webを参照する必要があるか、または別のルートがあるかどうかを確認するために、オプションを比較検討しますあなたが望むものを達成するために。

8
Thomas Stringer

チェックアウト この答えUri.UnescapeDataStringまたはSystem.Webを使用する必要はありません。関数WebUtilityおよびHtmlEncodeを含むSystem.Netの内部にHtmlDecodeというクラスがあります。

5
skeletank