असेंबली 'system.web, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, publickeytoken = b03f5f7f11d50a3a।' SQL कैटलॉग में नहीं मिला था


9

मैं एक SQL CLR फ़ंक्शन को HTTPUtility.UrlDecode पद्धति System.eb का उपयोग करके लागू करने का प्रयास कर रहा हूं, लेकिन मैं इसे परिनियोजित नहीं कर सकता। प्राप्त त्रुटि:

.Net SqlClient डेटा प्रदाता: Msg 6503, लेवल 16, स्टेट 12, लाइन 1 असेंबली 'system.web, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, publickeytoken = b03f5f7f7dd50a3a।' 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);
    }
}

यह इस धागे के संबंध में है । मैं VS2012 SSDT और डेटाबेस प्रोजेक्ट के साथ SQL Server 2014 हूं। अन्य लक्ष्य रूपरेखाओं के साथ प्रयास करें, जैसे 3, 3.5, 4 और 4.5।

मैंने System.Web के साथ CREATE ASSEMBLY बनाने की भी कोशिश की है, लेकिन तब उन्हें अन्य असेंबली, जैसे Microsoft.Build, System.Xaml को जोड़ना होगा, जब तक कि वे भी विफल न हों। मैं सिस्टम देखता हूं। समर्थित पुस्तकालयों की सूची में कोई विचार नहीं है?

जवाबों:


9

आप या तो Uri.UnescapeDataString (इन System) का उपयोग कर सकते हैं , जिस स्थिति में आपको इसे पास करने से पहलेReplace('+', ' ') स्ट्रिंग पर करने की आवश्यकता होगी , या यदि आप इसके साथ परेशान नहीं करेंगे, तो यह फ़ंक्शन SQL # के नि: शुल्क संस्करण में उपलब्ध है (जो मैं लेखक हूं)।Uri.UnescapeDataString

आयात System.Webकरना संभवत: इसके लायक होने से अधिक काम है। और वास्तव में, यह जोखिम भरा हो सकता है। एक अच्छा कारण है जो System.Web"समर्थित लाइब्रेरी" सूची में नहीं है जिसे आपने प्रश्न में जोड़ा है: यह काम करने की गारंटी नहीं है! आप गैर-यूएस ASCII वर्ण सेट के साथ काम करते समय, विशेष रूप से स्थितियों में भाग सकते हैं, जो कि अपेक्षित रूप से व्यवहार नहीं करते हैं, और Microsoft इसे ठीक नहीं करेगा। इसलिए, जब तक आप पूरी तरह से नहीं होते हैं, तब तक आपको गैर-समर्थित DLL को जोड़ने के बारे में सावधान रहना चाहिए। "समर्थित" सूची में DLLs को SQL सर्वर कोलाज और किसी भी अन्य पर्यावरणीय मुद्दों के साथ काम करने के लिए पूरी तरह से परीक्षण और सत्यापित किया गया है जो कि विंडोज में चल रहे मानक CLR और SQL सर्वर के अंदर चल रहे CLR के बीच भिन्न हैं।

असमर्थित .NET फ्रेमवर्क पुस्तकालयों को शामिल करने के कई नुकसानों के बारे में Microsoft से कुछ अतिरिक्त संसाधन हैं:


आपके कोड के बारे में कुछ नोट:

  1. कृपया पैरामीटर, इनपुट या आउटपुट के लिए .NET प्रकारों का उपयोग न करें। इसलिए, परिवर्तन string encodedXMLहोना चाहिए SqlString encodedXML
  2. यह फ़ंक्शन नियतात्मक है इसलिए इसे चिह्नित किया जाना चाहिए, अन्यथा आपको एक प्रदर्शन हिट भुगतना होगा। जोड़े IsDeterministic = trueको SqlFunctionविशेषता।

8

जैसा कि आपने नोट किया है, System.Webएक असमर्थित पुस्तकालय है। संदर्भ के लिए System.Webआपको कॉल करने की आवश्यकता होगी CREATE ASSEMBLY। ऐसा लगता है कि आपने ऐसा करने की कोशिश की, लेकिन आपने स्थान का संदर्भ कैसे दिया System.Web.dll? क्या आपने इसे किसी भिन्न स्थान पर कॉपी / पेस्ट किया था? SQL सर्वर एक ही स्थान पर निर्भर असेंबलियों का पता लगाने का प्रयास करेगा। दूसरे शब्दों में, यदि आप 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 सर्वर लोड अन्य असेंबली के सभी क्लाइंट संदेशों से देख सकते हैं। लेकिन ध्यान दें, SQL सर्वर इनमें से प्रत्येक के लिए निम्नलिखित चेतावनी प्रदर्शित करता है:

आप पंजीकृत कर रहे हैं SQL सर्वर होस्ट किए गए वातावरण में पूरी तरह से परीक्षण नहीं किया गया है और समर्थित नहीं है। भविष्य में, यदि आप इस असेंबली या .NET फ्रेमवर्क को अपग्रेड या सर्विस करते हैं, तो आपका सीएलआर इंटीग्रेशन रूटीन काम करना बंद कर सकता है। अधिक जानकारी के लिए कृपया SQL सर्वर पुस्तकें ऑनलाइन देखें।

इसी तरह, लेकिन जोड़ते हुए 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

यह वास्तव में यहां क्या हो रहा है, इसके बारे में ध्यान देने योग्य है, और भले ही अन्य अतिरिक्त असेंबली में टी-एसक्यूएल प्रवेश बिंदुओं के लिए तरीके नहीं हैं, वे अब एक निर्भरता हैं। मैं यह देखने के लिए विकल्पों को तौलना चाहूँगा कि क्या आपको वास्तव में संदर्भ देने की आवश्यकता हैSystem.Web , या यदि आप चाहते हैं तो पूरा करने के लिए कोई अन्य मार्ग है।


1
धन्यवाद थॉमस, कि काम किया है। मैं GUI के माध्यम से स्क्रिप्ट किए गए System.Web.dll की ओर इशारा करते हुए ASSEMBLY बनाने की कोशिश कर रहा था। मैं इसे एक समाचार समूह पोस्ट (पहले से जुड़ा हुआ) के उत्तर के रूप में प्रयोग कर रहा था, इसलिए इसे स्वयं उपयोग करने की कोई जलन नहीं है।
w

1
@ वॉक: जब तक आप पूरी तरह से नहीं होते, तब तक आपको गैर-समर्थित डीएलएल को जोड़ने के बारे में सावधान रहना चाहिए। एक अच्छा कारण है जो System.Web"समर्थित लाइब्रेरी" सूची में नहीं है जिसे आपने इससे जोड़ा था: यह काम करने की गारंटी नहीं है! । आप गैर-यूएस ASCII वर्ण सेट के साथ काम करते समय, विशेष रूप से स्थितियों में भाग सकते हैं, जो कि अपेक्षित रूप से व्यवहार नहीं करते हैं, और Microsoft इसे ठीक नहीं करेगा। मैं अपने उत्तर में इस बारे में एक नोट जोड़ दूंगा कि जो लोग नहीं जानते हैं उनके लिए स्पष्ट हो।
सोलोमन रटज़की

@srutzky मैं सहमत हूँ।
w

1
आप एक जीवन रक्षक है। मैं एसओएल होने जा रहा था अगर मैं इस पुस्तकालय को आयात नहीं कर सकता था। (यह उन अत्यंत दुर्लभ मामलों में से एक है।)
डेविनबॉस्ट

5

की जाँच करें इस जवाब । आप का उपयोग करने के लिए Uri.UnescapeDataStringया नहीं है System.Web। कार्यों WebUtilityके System.Netसाथ अंदर बुलाया एक वर्ग है HtmlEncodeऔर HtmlDecode


आपको यह इंगित करना चाहिए कि WebUtilitySQL Server 2012, 2014 या नए का उपयोग करने वालों के लिए ही उपलब्ध है। SQL Server 2005, 2008 और 2008 R2 पर वे अभी भी .NET फ्रेमवर्क 4.0 में पेश किए जाने के कारण इसका उपयोग नहीं कर पाएंगे।
सोलोमन रटज़की 16

@srutzky सवाल 2014 के लिए है लेकिन उपयोगकर्ताओं को इस सीमा के बारे में बताना महत्वपूर्ण है। क्या आपके पास एक लिंक है जो मैं पोस्ट कर सकता हूं जो .NET फ्रेमवर्क संस्करण और SQL सर्वर संस्करण के बीच संबंध दिखाता है?
कंकाल

मेरा लेख आज प्रकाशित हुआ था इसलिए अब SQL सर्वर संस्करणों और SQLCLR सुविधाओं (फ्रेमवर्क और CLR संस्करणों सहित) के बीच संबंध दिखाने वाला एक चार्ट मौजूद है: सीढ़ी से SQLCLR स्तर 5: विकास (SQL सर्वर के भीतर .NET का उपयोग करके) (मुफ्त पंजीकरण आवश्यक है) )।
सोलोमन रटज़की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.