Типы T-SQL и CLR для возвращаемого значения не совпадают - PullRequest
4 голосов
/ 24 августа 2011

Я пытаюсь создать пользовательскую функцию 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

Ошибка:

СОЗДАТЬ ФУНКЦИЮ для "EncryptString" не удалось, поскольку типы T-SQL и CLR для возвращаемого значения не совпадают.

Кто-нибудь знает, что мне не хватает?

Спасибо:)

Ответы [ 2 ]

6 голосов
/ 24 августа 2011

Вам не хватает As String в конце определения вашей функции:

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

И, очевидно, не включены Option Explicit или Option Strict (что может предупредить вас об этой проблеме). По умолчанию возвращаемый тип функции - Object, который не имеет сопоставления ни с каким типом данных SQL Server.


Не зная, что делает ваш пакет шифрования, также обычно плохой план хранить зашифрованную версию в виде строки (если ваш пакет автоматически не выполняет, например, кодировку Base64?)

3 голосов
/ 24 августа 2011

Вы не пропустили тип возврата для функции?

...