2010-01-04 2 views
0

Мне нужно изменить чужой код VB, и у меня нет большого опыта работы с VB6. Мне нужно вызвать хранимую процедуру SQL2000 с помощью ADODB. Один из параметров имеет тип Binary, и это дает мне проблемы. Каждый раз, когда я создаю параметр, я получаю сообщение об ошибке «Приложение использует значение неправильного типа для текущей операции». Ошибка происходит на линии cmd.parameter.append, она даже не дает мне случайного вызова cmd.execute.Заполнение команды ADODB Двоичные параметры в VB6

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) 

ответ

1

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

BinPassword = BinPassword & ChrB(AsciiCode) 

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

Существует также шанс DOK правильно относительно размера. Вы можете попробовать установить размер, чтобы что-то вы наверняка больше, чем вам нужно, или вы, вероятно, можете обойти настройки размера на всех, разделив работу на два заявления:

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

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

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

1

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

Заканчивать этот MSDN page который дает эту общую закономерность:

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

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

+0

Я попытался оставить размер. Я получил «Объект параметра неверно определен. Непоследовательная или неполная информация была предоставлена» – Aheho

+0

Если я не могу передать строку в adBinary, какой тип я использую? Я попробовал вариант, и это тоже не сработало. – Aheho

+1

Используйте adVarChar. Посмотрите, как это используется в другом параметре (UserID)? Когда вы используете adVarChar, полезно использовать размер. Итак, если пароли не превышают 20 символов, сохраните это. – DOK

1

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

Смежные вопросы