0

我需要修改别人的VB代码,我对VB6没有太多经验。我需要使用 ADODB 调用 SQL2000 存储过程。其中一个参数是二进制类型,它给我带来了问题。每次创建参数时,都会收到错误消息“应用程序为当前操作使用了错误类型的值”。错误发生在 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)
4

3 回答 3

1

我认为问题可能在于设置 size = 20。这可能是一个可选参数。试着把它排除在外。您可能需要在此处使用不同的 CreateParameter 重载。

查看这个MSDN 页面,它给出了这个一般模式:

command.CreateParameter (Name, Type, Direction, Size, Value)

此外,您已将 BinPassword 声明为字符串。您不能将字符串传递给 adBinary 的参数。您需要将二进制对象传递给其中,或将 adBinary 更改为 adVarChar。

于 2010-01-04T21:14:59.420 回答
1

试试这个为你的字符串连接:

BinPassword = BinPassword & ChrB(AsciiCode)

+不是正确的字符串连接运算符,并且 usingChrB应该让 VB 和 ADO 相信您实际上传递的是二进制数据,而不是字符数据。

DOK 的大小也有可能是正确的。您可以尝试将大小设置为您确定比您需要的更长的值,或者您可以通过将操作分成两个语句来完全设置大小:

cmd.Parameters.Append cmd.CreateParameter("ShaPassword", adBinary, adParamInput)
cmd.Parameters("ShaPassword").Value = BinPassword

这很奇怪,但它在过去对我有用。

只是为了增加强调以防有人再次看到这一点:对象的size属性Parameter不必与参数的确切字节长度匹配;它只需要至少足够大以支持您的论点。

于 2010-01-04T21:40:02.053 回答
1

您可能需要 adVarBinary。您很可能应该将字节数组作为值传递。

于 2010-01-04T22:31:09.900 回答