1

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

SQL 函数只接受两个字符串输入,其中一个是“盐”,另一个是实际文本并将其转换为十六进制。在 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(Encrypt("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
4

1 回答 1

2

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

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

其次,该Parameters集合最初是空的,必须在您尝试访问它之前填充(即 line cmd1.Parameters(0) = plainString)。有几种方法可以做到这一点,但我更喜欢使用以下CreateParameter方法手动创建参数:

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

此外,这在您的代码中并不明显,但请确保您已经定义了 ADO 常量,方法是引用类型 library包含 adovbs.inc

于 2012-10-27T05:59:11.680 回答