2011-08-24 94 views
4

我想通過CLR集成創建自定義SQL函數,但我遇到了T-SQL和CLR類型不匹配錯誤。返回值的T-SQL和CLR類型不匹配

DLL:

Imports System 
Imports System.Data 
Imports Microsoft.SqlServer.Server 

Public Class Encrypter_Decrypter 
    <SqlFunction(DataAccess:=DataAccessKind.Read)> _ 
    Public Shared Function EncryptString(ByVal strItem As String) 
     Dim strPassPhrase As String = "***********" 
     Dim strInitVector As String = "***********" 
     Dim objEncryption = New PCI.Encryption() 
     objEncryption.Initialise(strPassPhrase, strInitVector, -1, -1, -1, "", "", 1) 
     Dim EncryptedString As String = objEncryption.Encrypt(strItem) 
     objEncryption = Nothing 
     EncryptString = EncryptedString 
    End Function 
End Class 

創建SQL函數:

CREATE ASSEMBLY EncrypterDecrypter 
FROM 'c:\dll\Encrypter_Decrypter\Encrypter_Decrypter.dll' 
WITH PERMISSION_SET = SAFE 
GO 

CREATE FUNCTION EncryptString(@strItem NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) 
AS EXTERNAL NAME EncrypterDecrypter.Encrypter_Decrypter.EncryptString; 
GO 

錯誤:

CREATE FUNCTION爲 「EncryptString」 失敗,因爲T-SQL和CLR類型的返回值做不匹配。

有人知道我錯過了什麼嗎?

謝謝:)

回答

6

你錯過從你的函數定義的最後一個As String

Public Shared Function EncryptString(ByVal strItem As String) As String 

而且顯然不具備Option ExplicitOption Strict開啓(其中任一會提醒您對這個問題)。默認情況下,函數的返回類型爲Object,它沒有映射到任何SQL Server數據類型。


不知道你的密碼包做什麼,這也是通常是一個不錯的計劃是存儲加密版本的字符串(除非你的包會自動做如Base64編碼?)

+0

非常感謝你現在正在工作:)感謝您的建議,加密包自動完成所有工作 –

3

你不缺少函數的返回類型?