0

目的:

HTTPリクエストを実行する.Net 3.5を使用してVB.NET 2008を使用してDLLを作成したい

次に、(トリガーで) SQL Server 2005 から DLL を呼び出し、DLL にいくつかの変数を渡し、戻り値を取得します。

プロセスのどこにいるのですか。

DLL 'HTTPDLL.dll' を作成しました

ソース:

Imports System
Imports System.Configuration
Imports System.Collections.Generic
Imports System.Text
Imports System.Net
Imports System.Security
Imports System.Security.Permissions
Imports System.IO
Imports Microsoft.SqlServer.Server



Public Class HTTPDLL

Public Function HTTPPost(ByVal URL As String, ByVal Content As String) As Boolean

    Dim myURL As String = Trim(URL)
    Dim mycontent As String = Trim(Content)
    Dim rawOutput As String = ""

    'Get Acces Right to web
    Dim p As New WebPermission(NetworkAccess.Connect, myURL)
    p.Assert()

    'Prepare the web Request
    Dim req As WebRequest = WebRequest.Create(myURL)
    req.Timeout = 60000
    req.Method = "POST"
    req.ContentLength = mycontent.Length
    req.ContentType = "application/x-www-form-urlencoded"

    Dim sw As New StreamWriter(req.GetRequestStream())
    sw.Write(mycontent)
    sw.Close()

    Dim resp As WebResponse = req.GetResponse()
    Dim sr As New StreamReader(resp.GetResponseStream)
    rawOutput = sr.ReadToEnd()
    sr.Close()
    Return True


End Function

Public Function Test() As Integer
    Return 1
End Function


Public Function DllMain(ByVal hInst As Long, ByVal fdwReason As Long, _
ByVal lpvReserved As Long) As Boolean

    Dim s As String =     "sdfghjkolihdgjkhgiueghkyhekygigdjhgfkhsgdkhfgksjdhgkjshdgfkjhsgdkjfhgkshdgfkjhgskjdhgfkjhsdgkfhgskjdhfgkjsdhgfkshdgfkhgsdkfhgksdhfgkshdgfkshdgfkjhsgdkfhgskdhfgksjdhgfkjshgdfkhsgdkfhgskdhfgkshgdfkjhgskdjg"
    s &= "kjhdgjkshkdjfhklsjdhfljhgkhvbfiuvbli klrfgliu ghliebliuhdflivbdkljhgljuhfvliuhdf"
    Return True

End Function

End Class

DLL を SQL Server の c:/Windows/System フォルダーに配置しました。

これらのアセンブリをロードしました

HelloWorld System.Core System.XML.Linq

これらのコマンドを使用して

EXEC sp_configure 'show advanced options' , '1';
go
reconfigure
go

EXEC sp_configure 'clr enabled' , '1'
go

sp_configure 'Ole Automation Procedures', '1'
GO 
RECONFIGURE

-- Turn advanced options back off
EXEC sp_configure 'show advanced options' , '0';
go
reconfigure
GO
-- assembly style
ALTER DATABASE master SET TRUSTWORTHY ON
GO

CREATE ASSEMBLY [System.Core]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE ASSEMBLY [System.Xml.Linq]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll'
WITH PERMISSION_SET = UNSAFE
GO

create assembly HelloWorld from 'C:\WINDOWS\system\HTTPDLL.dll'
with permission_set = safe
GO

次に、拡張プロシージャを追加しました

USE [master]
GO
/****** Object:  ExtendedStoredProcedure [dbo].[HTTPDLL]    Script Date: 02/03/2010 11:45:28 ******/
EXEC dbo.sp_addextendedproc N'HTTPDLL', 'C:\WINDOWS\system\HTTPDLL.dll'

(この時点では、アセンブリを追加する必要があるかどうか、またはアセンブリを追加する必要があるかどうかはわかりません。これは Dll を直接参照するためです。)

私が解決する必要があるもの。DLL の (拡張プロシージャ) HTTPPost 関数を呼び出したい

私が試したこと exec HTTPPost "Msg 17750, Level 16, State 0, Procedure HTTPPost, Line 1 Could not load the DLL HelloWorld, or one of the DLLs it references. Reason: 126(The specified module could not be found.). "

exec HelloWorld.HTTPPost 'http://www.somewebsite.com',''

「メッセージ 2812、レベル 16、状態 62、行 1 ストアド プロシージャ 'HelloWorld.HTTPPost' が見つかりませんでした。」

私が必要とするもの: 私の実装を見て、すべてが適切に設定されているかどうかを確認し、その DLL を適切に呼び出して変数を送信し、その戻り値をキャッチする方法を (例とともに) 教えてください。とても感謝しています。

私は多くの投稿/記事に目を通し、ここまで私を連れてきた小片を手に入れましたが、すべてを網羅したものはありません.

私もこれを試しました

-- Scratch variables used in the script
DECLARE @retVal INT
DECLARE @comHandle INT
DECLARE @errorSource VARCHAR(8000)
DECLARE @errorDescription VARCHAR(8000)
DECLARE @retString VARCHAR(100)

-- Initialize the COM component.
EXEC @retVal = sp_OACreate 'HTTPDLL.HTTPDLL', @comHandle OUTPUT
IF (@retVal <> 0)
BEGIN
  -- Trap errors if any
  EXEC sp_OAGetErrorInfo @comHandle, @errorSource OUTPUT, @errorDescription OUTPUT
  SELECT [Error Source] = @errorSource, [Description] = @errorDescription
  RETURN
END

(および他のそのようなバリアント) を取得し、sp_OAGetErrorInfo の戻り値でこれを取得します。

「エラー ソースの説明 ODSOLE 拡張プロシージャの無効なクラス文字列」

おそらく私はそれを間違って呼んでいますが、私はそれを機能させることができませんでした(常に「無効なクラス文字列」を返します)

よろしくお願いいたします。

4

3 に答える 3

2

アンマネージ拡張ストアド プロシージャまたは OLE オートメーション COM オブジェクトとは異なる CLR アセンブリを作成しました。拡張ストアド プロシージャを追加するところまで、ある程度順調に進んでいました。あなたはここでそれをしません。アセンブリから CREATE PROCEDURE DDL 構文を使用してストアド プロシージャを作成する必要があります。SQL Server Central に関する私の記事のソース スクリプトと作成スクリプトを見てください。

http://www.sqlservercentral.com/articles/SQLCLR/65657/

アセンブリに対する外部アクセス権が必要です。アセンブリを SAFE で作成して、そのような Web サービス呼び出しを行うことはできません。これに加えて、この機能をトリガーとして追加することはお勧めできません。Web サービスに問題があり、未処理の CLR 例外を生成すると、トリガーでトランザクション エラーとロールバックが発生する可能性があります。それに加えて、Web サービスの呼び出しに遅延があると、SQL でのトランザクションの完了が遅れ、ブロックや応答時間の遅延が発生する可能性があります。

これに対するより良い解決策は、Service Broker Queue と Notification Service を External Activator と共に使用して外部プロセスをアクティブ化し、SQL Server の外部で非同期的にキューを操作することです。トリガーは、メッセージをキューに送信するだけで完了です。このようにして、サービス呼び出しに待ち時間があったり、サービスがダウンしたりしても、情報は引き続き保存されます。アクティブ化アプリを正しくビルドすると、トランザクションとしてキューが処理されるため、エラーが発生した場合でも、後で再試行するために情報がキューに保持されます。

于 2010-02-04T15:45:16.950 に答える
0

ACPerkins @ Experts-exchange は、この記事のワースト プラクティス - 外部イベントのトリガー http://www.sqlservercentral.com/articles/Triggers/worstpracticetriggeringexternalevents/1283/で私たちを啓発してくれました。

そのため、現在、他のいくつかの方法論を検討しています。ご協力いただきありがとうございます。アンソニー

于 2010-02-08T19:18:33.380 に答える
0

これを見てくださいhttp://dbalink.wordpress.com/2008/10/25/cannot-load-the-dll-error-in-sql-server-2005/

それはおそらくあなたが必要とするものです;-)

于 2010-02-03T22:09:26.213 に答える