2011-08-24 151 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

你不缺少函数的返回类型?