天天看點

調用dll 傳回65535_sql server調用.net開發的dll中函數

由于一些特殊原因,我們在sql server中需要調用.net dll中的函數來進行特殊操作。

例如,我寫了加密函數,希望通過sql代理執行字元串的加密操作,

1、開發一個.net版本的dll檔案

建立一個類庫程式命名為LINKJM,打開Visual Studio 2015,點選【檔案】,點選【建立】,并且項目命名為LINKJM

類代碼如下:

Public Class Entry
        ''' <summary>
        ''' 說明:對字元串進行des對稱加密,傳回加密後的字元串  
        ''' </summary>
        ''' <param name="sourceStr">需要加密的字元串</param>
        ''' <param name="myPassKey">加密使用的Des.key(8位字元串)</param>
        ''' <param name="myPassCheckCode">加密使用的參考Des.LV(8位字元串)</param>
        ''' <returns>傳回加密後的字元串</returns>
        ''' <remarks></remarks>
        Public Shared Function Encrypt(ByVal sourceStr As String, ByVal myPassKey As String, ByVal myPassCheckCode As String) As String
            Dim des As New System.Security.Cryptography.DESCryptoServiceProvider '//定義DES算法
            Dim inputByteArray As Byte()
            inputByteArray = System.Text.Encoding.Default.GetBytes(sourceStr)
            des.Key = System.Text.Encoding.UTF8.GetBytes(myPassKey) '//mypasskey des用8個字元.
            des.IV = System.Text.Encoding.UTF8.GetBytes(myPassCheckCode) '//myPassCheckCode, desc用8個字元
            Dim ms As New System.IO.MemoryStream
            Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
            Dim sw As New System.IO.StreamWriter(cs)
            sw.Write(sourceStr)
            sw.Flush()
            cs.FlushFinalBlock()
            ms.Flush()
            Encrypt = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
        End Function
    End Class
           

最後編譯成LINKJM.dll

2、sql server伺服器中加載dll程式集

2.1、找到對應的資料庫,選擇【可程式設計性】下的【程式集】

調用dll 傳回65535_sql server調用.net開發的dll中函數

右鍵點選程式集,選擇【建立程式集】如圖

調用dll 傳回65535_sql server調用.net開發的dll中函數

2.2、加載指定的dll檔案。

如圖

調用dll 傳回65535_sql server調用.net開發的dll中函數

這樣在程式集下面多了一個程式集。如圖

調用dll 傳回65535_sql server調用.net開發的dll中函數

2.3、打開CLR調用,本身sql server預設是不打開的。需要執行下語句

exec sp_configure 'clr enabled', 1;
reconfigure;
           

3、設定一個函數調用dll内部的函數。

代碼如下:

create FUNCTION [dbo].[CardEncrypt](@cardno Nvarchar(80),@passkey varchar(50),@checkcode varchar(50))
RETURNS [nvarchar](200) 
WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [LINKJM].[LINKJM.Entry].[Encrypt]
           

解讀說明:

函數中的三個參數基本是對應原有程式集中的Encrypt,順序一緻,并給出一個傳回值

ByVal sourceStr As String, ByVal myPassKey As String, ByVal myPassCheckCode As String
           
[LINKJM].[LINKJM.Entry].[Encrypt] 這段解讀

程式集.[空間.類名].函數

4、以上操作完畢後,就可以通過CardEncrypt函數調用進行字元串加密操作。

其他類似的函數,基本都可以類似操作,加強sql server自身的運算,實作一些sql server本身性能缺陷及功能無法實作的内容。