通过经典ASP函数执行用户定义的函数

时间:2012-10-26 20:22:40

标签: encryption asp-classic adodb parameterized-query

好的,我正在尝试编写一个经典ASP函数,它将调用SQL函数并返回输出。 我试图使用一个参数化的ADODB连接,但我不太清楚它们是如何工作的。试图学习正确的方法。

SQL函数只需要两个字符串输入,其中一个是“salt”,另一个是实际文本,并将其转换为十六进制。 在SQL中运行良好,但我无法通过经典ASP工作。

我一直在, ADODB.Command错误'800a0cc1'

在与所请求的名称或序号对应的集合中找不到项目。

Sub Encrypt(plainString)
    strSQL = "SET NOCOUNT ON;SELECT dbo.Encrypt('xx', '?') as keycode"
    Set cnnEncrypt = Server.CreateObject("ADODB.Connection")
    cnnEncrypt.open CONNSTRING

    Dim cmd1
    Set cmd1 = Server.CreateObject("ADODB.Command")
    cmd1.ActiveConnection = cnnEncrypt
    cmd1.CommandText = strSQL
    cmd1.CommandType = adCmdText
    cmd1.Parameters(0) = plainString      (**Original Error Occured Here!!!!**)
    Set rsEncrypt = cmd1.Execute()

    If not rsEncrypt.EOF Then
        Encrypt = rsEncrypt.Fields("keycode").Value
    Else
        Encrypt = "blank"
    End If

    ' Clean Up    
    rsEncrypt.Close    
    Set rsEncrypt = Nothing    
    cnnEncrypt.Close    
    Set cnnEncrypt = Nothing    

End Sub

审查“Cheran Shunmugavel”答案后的新工作版本。 像这样在网站上打电话

< %Response.Write Decrypt(加密(“test”))%>

您无法将加密代码打印到页面,因为它是二进制的。你需要一个Binary to String函数。 我从Sub转换为Function,因为我希望函数返回一个值。

Function Encrypt(byVal plainString)
    strSQL = "SET NOCOUNT ON;SELECT dbo.Encrypt('xx', ?) as keycode"
    Set cnnEncrypt = Server.CreateObject("ADODB.Connection")
    cnnEncrypt.open CONNSTRING

    Dim cmd1
    Set cmd1 = Server.CreateObject("ADODB.Command")
    cmd1.ActiveConnection = cnnEncrypt
    cmd1.CommandText = strSQL
    cmd1.CommandType = adCmdText
    cmd1.Parameters.Append cmd1.CreateParameter("", adVarChar, adParamInput, Len(plainString)+1, plainString)  
    Set rsEncrypt = cmd1.Execute()

    If not rsEncrypt.EOF Then
        Encrypt = rsEncrypt.Fields("keycode").Value
    Else
        Encrypt = "blank"
    End If

    ' Clean Up    
    rsEncrypt.Close    
    Set rsEncrypt = Nothing    
    cnnEncrypt.Close    
    Set cnnEncrypt = Nothing    
End Function

这是解密功能。​​

Function Decrypt(byVal plainString)
    strSQL = "SET NOCOUNT ON;SELECT dbo.Decrypt('xx', ?) as keycode"
    Set cnnDecrypt = Server.CreateObject("ADODB.Connection")
    cnnDecrypt.open CONNSTRING

    Dim cmd1
    Set cmd1 = Server.CreateObject("ADODB.Command")
    cmd1.ActiveConnection = cnnDecrypt
    cmd1.CommandText = strSQL
    cmd1.CommandType = adCmdText
    cmd1.Parameters.Append cmd1.CreateParameter("", adVarBinary, adParamInput, LenB(plainString)+1, plainString)  
    Set rsDecrypt = cmd1.Execute()

    If not rsDecrypt.EOF Then
        Decrypt = rsDecrypt.Fields("keycode").Value
    Else
        Decrypt = "blank"
    End If

    ' Clean Up    
    rsDecrypt.Close    
    Set rsDecrypt = Nothing    
    cnnDecrypt.Close    
    Set cnnDecrypt = Nothing    
End Function

1 个答案:

答案 0 :(得分:2)

首先,您不需要参数占位符周围的分隔符。 SQL Server将适当地处理它。

strSQL = "SET NOCOUNT ON;SELECT dbo.Encrypt('xx', ?) as keycode"

其次,Parameters集合最初为空,必须先填充,然后再尝试访问它(即行cmd1.Parameters(0) = plainString)。有几种方法可以做到这一点,但我更喜欢使用CreateParameter方法手动创建参数:

cmd1.Parameters.Append cmd1.CreateParameter("", adVarChar, adParamInput, Len(plainString), plainString)

此外,您的代码并不明显,但请确保您已通过referencing the type libraryincluding adovbs.inc定义了ADO常量。