2012-11-23 24 views
5

में COM एक्सेस करना आशा है कि आप सभी का दिन अच्छा रहे!एसक्यूएल सीएलआर

मुझे पिछले तीन दिनों के बारे में सोचने के लिए आपकी सिफारिशों की आवश्यकता है। मेरे पास एक अप्रबंधित मंच में लिखा गया एक COM घटक है। घटक में एक तरीका है जो कुछ संवेदनशील डेटा देता है और मुझे जितनी जल्दी हो सके वैल्यू को स्टोर करने की आवश्यकता होती है।

मुझे COM ऑब्जेक्ट तक पहुंचने और मूल्य प्राप्त करने के लिए यूडीएफ को कॉल करने की आवश्यकता है। मैं इस की कोशिश की है अब तक और मैं इस अपवाद हो रही है:

Msg 6522, Level 16, State 2, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "GetRate": System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {D039A99F-5D45-42C7-A53C-507913D8C6D6} failed due to the following error: 80040154.
System.Runtime.InteropServices.COMException:
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at UserDefinedFunctions.GetRate(SqlString Source_Currency_Name, SqlString Destination_Currency_Name, SqlMoney Amount, SqlBoolean Mode)

ऐसा लगता है कि समारोह पंजीकृत COM घटक (80040154) नहीं देख सकता। क्लियर असेंबली अप्रतिबंधित के रूप में पंजीकृत है। मैंने यूडीएफ को 'एस' या विंडोज इंटीग्रेटेड मोड में कॉल करने का प्रयास किया। इसमें कोई फर्क नही है।

यह है COM घटक और कोड आरंभ के लिए कोड ठीक बाहर एसक्यूएल काम कर रहा है:

Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("D039A99F-5D45-42C7-A53C-507913D8C6D6"), true)) 

वहाँ वैसे भी इस काम कर रहे लोगों को बनाने के लिए है? एक तरफ या किसी अन्य को मुझे एक यूडीएफ की आवश्यकता है, इस COM ऑब्जेक्ट को कॉल करें या कम से कम कुछ यूडीएफ के माध्यम से .NET रिमोटिंग के साथ कुछ विंडोज़ सेवा तक पहुंचें। इस सुझाव के माध्यम से मुझे हर सुझाव की सराहना की जाएगी।

सभी को धन्यवाद।

+0

इस लिंक को जांचें http://stackoverflow.com/questions/7289620/activator-createinstanceguid-works-inside-vside-but-not- वैकल्पिक रूप से –

+1

@DJKRAZE मैंने उल्लेख किया है कि कोड SQL के बाहर ठीक काम कर रहा है। :) – Rikki

+0

@BehnamEsmaili ऐसा लगता है कि लिंक ने एसक्यूएल के बाहर COM ऑब्जेक्ट शुरू करने की समस्या हल कर दी है और मुझे इसके साथ कोई समस्या नहीं है जैसा कि मैंने पहले ही उल्लेख किया है। – Rikki

उत्तर

4

मुझे लगता है कि आप SQL सर्वर में अपनी सीएलआर असेंबली आयात कर रहे हैं? यदि ऐसा है, तो यह एक मंच/वास्तुकला मुद्दा हो सकता है। जब आप अपना डीएलएल बनाते हैं तो आपका लक्ष्यीकरण क्या लक्ष्य है?

सुनिश्चित करें कि आप अपने डीएलएल को सही प्लेटफ़ॉर्म (यानी x86, x64) के विरुद्ध बना रहे हैं।

मैं सुझाव दूंगा कि आप परियोजना प्रोजेक्ट में "Any CPU" से "X86" से विजुअल स्टूडियो में बिल्ड/प्लेटफ़ॉर्म के लक्ष्य में अपने प्रोजेक्ट के प्लेटफ़ॉर्म को संशोधित करें।

फिर "DROP ASSEMBLY" का उपयोग करें, इसके बाद "CREATE ASSEMBLY", सही ढंग से निर्मित डीएल पुनः आयात करने के लिए।

तुम भी सुनिश्चित करना है कि आप निम्नलिखित परिवर्तन कर दिया है सकते हैं:

  1. जानें अपने COM वस्तु HKey_Classes_Root/Wow6432Node/CLSID के तहत GUID।
  2. एक बार स्थित होने पर, एक नया REG_SZ (स्ट्रिंग) मान जोड़ें। नाम एपआईडी होना चाहिए और डेटा एक ही COM ऑब्जेक्ट GUID होना चाहिए जो आपके पास खोजा गया है।
  3. HKey_Classes_Root/Wow6432Node/AppID के तहत एक नई कुंजी जोड़ें। नई कुंजी को COM ऑब्जेक्ट GUID के समान कहा जाना चाहिए।
  4. नई कुंजी के तहत आपने अभी जोड़ा है, एक नया REG_SZ (स्ट्रिंग) मान जोड़ें, और इसे DllSurrogate कहते हैं। मूल्य खाली छोड़ दें।
  5. यदि यह पहले से मौजूद नहीं है, तो HKey_Local_Machine/Software/Classes/AppID के तहत एक नई कुंजी बनाएं।
  6. फिर, नई कुंजी को COM ऑब्जेक्ट के GUID के समान कहा जाना चाहिए। इस कुंजी के तहत कोई मूल्य जोड़ने की आवश्यकता नहीं है।

SQL समाधान का उपयोग करने के लिए एक और समाधान डब्ल्यूसीएफ सेवा का उपयोग करना होगा। ऐसा करने के तरीके के लिए निम्नलिखित पर मेरे मार्गदर्शक देखें:

http://www.codeproject.com/Articles/21149/Invoking-a-WCF-Service-from-a-CLR-Trigger

+0

महोदय, मैंने प्रश्न पोस्ट करने से पहले भी इसे चेक किया था। वह मेरी समस्या नहीं है। मुझे पता है कि विधानसभा कार्यों को कैसे छोड़ें और बनाएं, टिप्पणियों पर भी नजर डालें। @ सिमन मॉरीयर ने कहा कि मंच मुद्दे और मैंने अभी जवाब दिया है। :) – Rikki

+1

मुझे लगता है कि आप जवाब नहीं दे रहे हैं। पहला भाग सभी प्रश्न है। – Rikki

+0

जब भी कोई बाउंटी पर कोई प्रश्न पूछता है, तो इसका मतलब है कि उन्हें अनुमान लगाने और कुछ सरल विवरणों की तुलना में कुछ और चाहिए। मुझे खेद है महोदय, लेकिन आपका जवाब मुझे इससे ज्यादा नहीं देता है। मंच के बारे में टिप्पणियों पर मैंने आपको जो जानकारी दी है, उसके बावजूद, आपका उत्तर केवल CREATE और DROP कथन के बारे में है। क्या मैं सही हूँ सर? – Rikki

5

सामान्य तौर पर मैं COM और एसक्यूएल के बीच एक सेतु के रूप SQL CLR वस्तुओं के उपयोग की सलाह नहीं होता। सुरक्षा से शुरू होने वाली बहुत सी संभावित चेतावनीएं हैं और बहुत ही बोझिल रिलीज प्रक्रियाओं के साथ समाप्त होती हैं, जिसके लिए उत्पादन एसक्यूएल बॉक्स में भौतिक पहुंच की आवश्यकता होती है जो आसानी से उपलब्ध हो सकता है या नहीं।

मैंने यह भी देखा है कि आप एक्टिवेटर का उपयोग कर रहे हैं। क्रिएटइंस्टेंस और फिर इसे क्लिसिड की आपूर्ति करना। आपकी मूल पोस्ट में आप यह कहते हैं कि यह एक COM clsid है। मुझे यकीन नहीं है कि एसक्यूएल सीएलआर में बनाए गए एपडोमेन से काम कर रहे एक्टिवेटर वास्तव में कॉम क्लिसिड के लिए ऑब्जेक्ट पा सकते हैं।

तरह से मैं यह कोशिश करेंगे:

  • अपने कॉम के लिए प्रबंधित प्रॉक्सी बनाएं
  • सुनिश्चित करें कि यह हस्ताक्षर किए और गाक में रखा
  • कोशिश एक्सेस करना है कि SQL CLR
से प्रॉक्सी प्रबंधित

लेकिन मुझे गंभीरता से संदेह है कि यह काम करेगा। किसी भी रिमोटिंग समाधान डब्ल्यूसीएफ/वेब सर्विसेज/रिमोटिंग या एसक्यूएल ब्रोकर भी बेहतर शर्त की तरह दिखते हैं।

संक्षेप में वास्तविक .NET और SQL कोडज़ को देखे बिना कुछ और बताना मुश्किल है।

+0

+1 अच्छा शरीर का प्रयास करें। मैंने एसक्यूएल सीएलआर में .NET Remoting का उपयोग करने का प्रयास किया है, लेकिन यह जटिल चीजों को और अधिक लगता है। कोई अन्य सुझाव? मुझे एसक्यूएल सीएलआर से COM तक पहुंचने के लिए एक समाधान की आवश्यकता है। ये सभी तकनीकी मुद्दे हैं जिन्हें मैंने पहले से ही उनमें से अधिकांश की कोशिश की है। रास्ते से धन्यवाद। – Rikki

+0

आप इस लिंक में कुछ गूढ़ समाधानों को भी आजमा सकते हैं http://www.codeproject.com/Articles/37140/How-to-Integrate-an-OLE-Object-with-SQL- सर्वर – b0rg

0

sys.dm_clr_properties से इस cmd को चुनें * sys.dm_clr_properties से चुनें यदि आपके COM ऐप का शुद्ध संस्करण उस वापसी के सीएमडी का बड़ा संस्करण केवल तभी काम करेगा यदि नेट संस्करण कम या बराबर है !!!