2012-11-23 7 views
5

皆さんは良い一日をお過ごしたいと思っています!SQLでCOMにアクセスするCLR

私はこの3日間について考えてきたことについてお勧めします。私はCOMコンポーネントをアンマネージドプラットフォームで書いています。このコンポーネントには、ある種の機密データを返すメソッドがあり、取得するとすぐに値を格納する必要があります。

私が必要とするのは、COMオブジェクトにアクセスして値を取得するUDFを呼び出すことです。私はこれまでのところ、これを試してみたと私はこの例外を取得しています:

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)を見ることができないようです。 clrアセンブリは無制限として登録されます。私は 'sa'またはWindows統合モードでUDFを呼び出そうとしました。違いはありません。

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

このワーキング人を作るためにとにかくがあります:

これは、COMコンポーネントとコードを初期化するためのコードがうまく外SQLを働いているのですか? 1つの方法または別の私はこのCOMオブジェクトを呼び出すUDFをするか、少なくともこのUDFを介して.NETリモーティングでいくつかのWindowsサービスにアクセスする必要があります。すべての提案は、この方法で私をガイドしていただければ幸いです。

ありがとうございます。

+0

このリンクをチェックするhttp://stackoverflow.com/questions/7289620/activator-createinstanceguid-works-inside-vside-but-not-externally –

+1

@DJKRAZE私は、コードがSQLの外部で正常に動作していると述べました。 :) – Rikki

+0

@BehnamEsmailiリンクがSQLの外部でCOMオブジェクトを開始する問題を解決したと私はすでに述べたようにそれには問題はありません。 – Rikki

答えて

4

CLRアセンブリをSQL Serverにインポートしようとしていますか?もしそうなら、これはプラットフォーム/アーキテクチャの問題かもしれません。 DLLをビルドする際のターゲットとするプラットフォームは何ですか?

正しいプラットフォーム(つまりx86、x64)に対してDLLを構築していることを確認してください。

プロジェクトのプラットフォームをVisual Studioのビルド/プラットフォームのターゲットで"Any CPU"から"X86"に変更することをお勧めします。

次に、"DROP ASSEMBLY"、その後には"CREATE ASSEMBLY"を使用して、正しくビルドされたdllを再インポートします。

また、あなたは、以下の変更行ったことを確実にすることもできます。

  1. あなたのCOMオブジェクトGUIDが HKEY_CLASSES_ROOT/WOW6432NODE/CLSIDの下に位置を確認します。
  2. 見つかったら、新しいREG_SZ(文字列)値を追加します。名前は AppIDで、データは同じが検索されたCOMオブジェクトGUIDである必要があります。
  3. 新しいキーをHKey_Classes_Root/Wow6432Node/AppIDに追加します。新しいキー は、COMオブジェクトのGUIDと同じに呼び出す必要があります。
  4. 追加したばかりの新しいキーの下に、新しいREG_SZ(文字列)値 を追加し、DllSurrogateという名前を付けます。値を空のままにします。
  5. が存在しない場合は、HKey_Local_Machine/Software/Classes/AppIDの下に新しいキーを作成します。
  6. また、新しいキーは、COMオブジェクトの GUIDと同じ名前で呼び出す必要があります。このキーの下に値を追加する必要はありません。

もう1つの解決策は、SQL clrを呼び出すWCFサービスを使用することです。これを行う方法については、以下で私のガイドを参照してください:

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の間のブリッジとしてのSQL CLRオブジェクトを使用してお勧めしません。セキュリティから始まり、非常に扱いにくいリリース手順で終わる潜在的な注意点がたくさんあります。これは、簡単に利用できるSQLボックスに物理的にアクセスする必要があります。

また、Activator.CreateInstanceを使用していて、それにclsidを指定していることに気付きました。元の投稿では、それはCOMのclsidであることを意味します。 SQL CLRで作成されたAppDomainから作業しているActivatorが実際にcom clsidのオブジェクトを見つけることができるかどうかはわかりません。

私はそれをしようと方法:

  • SQL CLRから
をプロキシを管理
  • それがGACに署名したと置かれています確認してみのアクセスを行い、あなたのCOM
  • の管理対象のプロキシを作成します。

    しかし、私はそれがうまくいくか真剣に疑う。あらゆるリモートソリューションWCF/WebServices/Remoting、さらにはSQL Brokerがより良い賭けのように思えます。

    要するに、実際の.netとsql codezを見ずに何も言わないのは簡単です。

  • +0

    +1素敵なボディを試してみてください。私はSQL CLRで.NET Remotingを使用しようとしましたが、それはもっと複雑に思えます。その他の提案はありますか? SQL CLRからCOMにアクセスするためのソリューションが必要です。これらはすべて私がすでに試した技術的な問題です。途中でありがとう。 – Rikki

    +0

    また、このリンクのような難解な解決策を試すこともできます。http://www.codeproject.com/Articles/37140/How-to-Integrate-an-OLE-Object-with-SQL-Server – b0rg

    0

    このバージョンのcmdは、netバージョンがそれ以下の場合にのみ動作するCOMアプリのネットバージョンが有効な場合、sys.dm_clr_propertiesからsql select *を実行します。

    関連する問題