好的,我正在尝试编写一个经典的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新的工作版本后,审查“车兰顺穆格维尔”的答案。像这样在站点上调用
<% Response.Write Decrypt(Encrypt("test")) %>
您不能将加密代码打印到页面,因为它是二进制代码。你需要一个二进制到字符串的函数。我将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发布于 2012-10-27 13:59:12
首先,您不需要在参数占位符周围使用分隔符。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 library或including adovbs.inc定义了ADO常量。
https://stackoverflow.com/questions/13093903
复制相似问题