заполнение команды ADODB Двоичные параметры в VB6 - PullRequest
0 голосов
/ 05 января 2010

Мне нужно изменить чужой код VB, и у меня нет особого опыта работы с VB6. Мне нужно вызвать хранимую процедуру SQL2000 с помощью ADODB. Один из параметров имеет тип 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 ]

1 голос
/ 05 января 2010

Попробуйте это для конкатенации строк:

BinPassword = BinPassword & ChrB(AsciiCode)

+ не является правильным оператором конкатенации строк, и использование ChrB должно убедить VB и ADO, что вы действительно передаете ему двоичные данные, а не символьные данные.

Есть также шанс, что ДОК будет прав насчет размера. Вы можете попробовать установить размер, который, как вы уверены, длиннее, чем вам нужно, или вы можете вообще обойтись без установки размера, разделив операцию на два оператора:

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

Это странно, но это работало на меня в прошлом.

Просто для дополнительного акцента на случай, если кто-то увидит это снова: свойство size в Parameter объектах не обязательно должно соответствовать точной длине в байтах вашего аргумента; он просто должен быть по крайней мере достаточно большим, чтобы вместить ваш аргумент.

1 голос
/ 05 января 2010

Вы, вероятно, хотите adVarBinary. Скорее всего, вы должны передавать байтовые массивы в качестве значений.

1 голос
/ 05 января 2010

Я думаю, что проблема может быть в установке размера = 20. Это может быть необязательным аргументом. Попробуйте оставить это. Возможно, здесь есть другая перегрузка CreateParameter, которую вам нужно использовать.

Проверьте эту страницу MSDN , которая дает общий шаблон:

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

Кроме того, вы объявили BinPassword в качестве строки. Вы не можете передать строку в параметр adBinary. Вам нужно передать в него двоичный объект или заменить adBinary на adVarChar.

...