Pergunta

Eu preciso modificar o código VB de outra pessoa, e eu não tenho muita experiência com VB6. Eu preciso chamar um procedimento SQL2000 armazenados usando ADODB. Um dos parâmetros é do tipo binário e ele está me dando problemas. Toda vez que eu criar o parâmetro, eu recebo um erro "Aplicativo usa um valor do tipo errado para a operação atual". O erro acontece na linha cmd.parameter.append, nem sequer me dar uma chamada chance do 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)
Foi útil?

Solução

Tente este para o seu concatenação:

BinPassword = BinPassword & ChrB(AsciiCode)

+ não é o operador de concatenação direita, e usando ChrB deve convencer VB e ADO que você está realmente passando-dados binários, não dados de caracteres.

Há também a chance DOK está certo sobre o tamanho. Você pode tentar definir o tamanho para algo você está certo é mais do que você precisa, ou você provavelmente pode obter em torno de definir o tamanho em tudo, dividindo a operação em duas instruções:

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

É estranho, mas é trabalhado para mim no passado.

Apenas por ênfase adicionada no caso de alguém vê-lo novamente: a propriedade size em Parameter objetos não tem que coincidir com o comprimento byte exato do seu argumento; ele simplesmente tem de ser , pelo menos grande o suficiente para manter o seu argumento.

Outras dicas

Eu acho que o problema pode estar na criação size = 20. Isso pode ser um argumento opcional. Tente deixá-lo fora. Pode haver uma sobrecarga diferente de CreateParameter que você precisa para usar aqui.

Confira este MSDN página que dá a este padrão geral:

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

Além disso, você declarou BinPassword como uma String. Você não pode passar uma string em um parâmetro de adBinary. Você precisa passar um objeto binário em que, ou a mudança adBinary para adVarChar.

Você provavelmente quer adVarBinary. Muito provavelmente você deve estar passando matrizes de byte como valores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top