我需要修改其他人的VB代码,而且我对VB6没有多少经验。 我需要使用ADODB调用SQL2000存储过程。其中一个参数是Binary类型,它给我带来了问题。每次我创建参数时,都会收到错误“应用程序使用错误类型的值进行当前操作”。错误发生在cmd.parameter.append行,它甚至没有给我一个机会调用cmd.execute。
Dim HexPassword As String
Dim BinPassword As String
Dim AsciiCode As Integer
Dim unitDigit As String
Dim TensDigit As String
Set obj_hash = New EDCrypt
' Returns Hash of password hex encoded
HexPassword = obj_hash.GetTextHash(Trim(txtPassword.text), haSHA1)
' Converts Hex Encoded string to Binary encoded string
Dim i As Integer
For i = 1 To 40 Step 2
unitDigit = Mid(HexPassword, i + 1, 1)
TensDigit = Mid(HexPassword, i, 1)
AsciiCode = HexStrtoInt(TensDigit + unitDigit)
BinPassword = BinPassword + Chr(AsciiCode)
Next i
conn.Open ConnectionString
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "ValidatePasswordNew"
cmd.Parameters.Append cmd.CreateParameter("LoginID", adVarChar, adParamInput, 30, UserID)
cmd.Parameters.Append cmd.CreateParameter("ShaPassword", adBinary, adParamInput, 20, BinPassword)
答案 0 :(得分:1)
我认为问题可能在于设置size = 20.这可能是一个可选参数。试着把它拿出来。您可能需要在此处使用不同的CreateParameter重载。
查看此MSDN page,其中给出了这种一般模式:
command.CreateParameter (Name, Type, Direction, Size, Value)
此外,您已将BinPassword声明为String。您不能将字符串传递给adBinary的参数。您需要将二进制对象传递给它,或将adBinary更改为adVarChar。
答案 1 :(得分:1)
尝试使用此字符串连接:
BinPassword = BinPassword & ChrB(AsciiCode)
+
不是正确的字符串连接运算符,使用ChrB
应该说服VB和ADO你真正传递的是二进制数据,而不是字符数据。
DOK也有可能对这个规模有所帮助。您可以尝试将大小设置为您确定的长度超过您需要的大小,或者您可以通过将操作分成两个语句来设置大小:
cmd.Parameters.Append cmd.CreateParameter("ShaPassword", adBinary, adParamInput)
cmd.Parameters("ShaPassword").Value = BinPassword
这很奇怪,但过去它对我有用。
只是为了增加重点,以防有人再次看到这一点:size
对象上的Parameter
属性不必与参数的确切字节长度匹配;它只需至少足以容纳你的论点。
答案 2 :(得分:1)
你可能想要adVarBinary。您很可能应该将Byte数组作为值传递。