在VB6中填充ADODB命令二进制参数

时间:2010-01-04 21:03:19

标签: vb6 adodb

我需要修改其他人的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)

3 个答案:

答案 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数组作为值传递。