繁体   English   中英

从SQL Server执行VB.NET DLL

[英]Executing a VB.NET DLL From SQL Server

目的:

我们要使用VB.NET 2008和.Net 3.5编写的DLL执行HTTP请求

然后,我们要从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“消息17750,级别16,状态0,过程HTTPPost,第1行无法加载DLL HelloWorld或它引用的DLL之一。原因:126(找不到指定的模块。)。 “

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扩展过程无效的类字符串”

也许我打错了电话,但我无法使它正常工作(总是返回“无效的类字符串”)

预先感谢您的帮助!。

您创建的CLR程序集不同于非托管扩展存储过程或OLE Automation COM对象。 您已经步入正轨,可以添加扩展存储过程了。 你不在这里 您需要使用程序集中的CREATE PROCEDURE DDL语法创建存储过程。 看一下我在SQL Server Central上的文章的源脚本和创建脚本:

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

您将需要在Assembly上使用外部访问权限,而该权限不能使用SAFE创建,并且无法进行此类Web服务调用。 除此之外,添加此功能作为触发器不是一个好主意。 如果Web服务存在问题,并且您生成了未处理的CLR异常,则可能导致事务失败和触发器回滚。 除此之外,如果Web服务调用中存在延迟,您还将延迟SQL中事务的完成,这可能会导致阻塞和响应时间变慢。

对此的更好解决方案是将Service Broker队列和通知服务与外部激活程序一起使用,以激活外部进程以在SQL Server外部异步地处理队列。 触发器所需要做的就是将消息发送到队列中并完成。 这样,如果服务调用中存在延迟或服务关闭,则信息仍会存储,并且如果您正确构建了激活应用程序,它将以事务方式处理队列,因此失败会将信息保留在队列中,以便稍后重试。

ACPerkins @ Experts-exchange通过这篇文章启发了我们:最差实践-触发外部事件http://www.sqlservercentral.com/articles/Triggers/worstpracticetriggeringexternalevents/1283/

因此,我们目前正在研究其他一些方法。 谢谢你的帮助。 安东尼

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM