2010-02-03 2 views
0

Цель:Выполнение VB.NET DLL из SQL Server

мы хотим написать DLL с использованием VB.NET 2008 с использованием .Net 3.5, который выполняет запрос HTTP

мы тогда хотим вызвать DLL From SQL Server 2005 (в триггере) и передать DLL некоторые переменные и получить возвращаемое значение.

Куда im в процессе.

Я создал 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, уровень 16, состояние 0, процедуры HttpPost, Line 1 Не удалось загрузить DLL HelloWorld, или одна из библиотек DLL, на которые ссылается. Причина: 126 (Указанный модуль не найден.). "

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

"Msg 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 Расширенная процедура Неверная строка класса»

Возможно, я вызываю это неправильно, но я havent смог заставить его работать (всегда возвращать «недопустимую строку класса»)

Заранее благодарю вас за помощь !.

ответ

2

Вы создали Ассамблею CLR, которая отличается от неуправляемого расширенной хранимой процедуры или объекта OLE Automation COM. Вы были несколько в курсе до добавления расширенной хранимой процедуры. Вы этого не делаете. Вам необходимо создать хранимую процедуру, используя синтаксис CREATE PROCEDURE DDL из Assembly. Посмотрите на скрипты источника и создания для моей статьи на сервере SQL Central:

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

необходимы права доступа на внешние Ассамблеи, она не может быть создан с помощью SAFE и сделать вызов веб-службы как это. В дополнение к этому добавление этой функции в качестве триггера - плохая идея. Если есть проблема с веб-сервисом, и вы генерируете необработанное исключение CLR, это может привести к сбою транзакций и откату в триггере. В дополнение к этому, если в вызове webservice есть латентность, вы задерживаете завершение транзакции в SQL, что может привести к блокировке и медленному времени отклика.

Лучшим решением для этого является использование службы очереди обслуживания и службы уведомлений с внешним активатором для активации внешнего процесса для работы в очереди асинхронно и вне SQL Server. Весь триггер должен сделать это отправить сообщение в очередь, и это сделано. Таким образом, если в вызове службы или в сеансе есть задержка, информация все еще сохраняется, и если вы правильно создаете приложение для активации, оно будет обрабатывать транзакции в транзакции, поэтому сбой будет содержать информацию в очереди для повторной попытки позже.