#arrays #vb6 #casting #byte #bytearray
#vb6 #Кастинг #байт #массивы
Вопрос:
Если у вас есть столбец типа binary в SQL и вы возвращаете его с помощью ADODB в VB6, даже если столбец содержит только 1 байт данных, он должен быть сохранен в виде массива байтов.
Так, например:
Dim cm As ADODB.Command
Dim rs As ADODB.Recordset
Set cm = New ADODB.Command
Set rs = New ADODB.Recordset
With cm
.ActiveConnection = cn
.CommandTimeout = 30
.CommandType = adCmdText
.CommandText = "SELECT * FROM Table WHERE RowID = ?"
.Parameters.Append .CreateParameter("TableID", adInteger, adParamInput, , TableID)
End With
RecordsetOpen cn, rs, cm, , adOpenForwardOnly, adLockReadOnly
With rs
If .State = adStateOpen Then
If .RecordCount > 0 Then
Dim tempArray() As Byte
tempArray = .Fields("BinaryColumn")
''Success! Returns array containing 1 Byte in it
Dim value as Byte
value = .Fields("BinaryColumn")
''Fails! Run-Time error '13' Type Mismatch
End If
End If
End With
Многие люди посмотрели бы на это и сказали «Ну и что? Сбой из-за несоответствия типов, потому что у вас есть Byte () и вы пытаетесь установить Byte!».
Мой аргумент — поля.Значение является свойством типа Variant, и, учитывая либеральную политику VB6 в отношении приведения типов, я бы подумал, что что-то подобное сработает.
Кто-нибудь может объяснить, почему это не удается?
Комментарии:
1. Вы должны указать, к какому индексу массива вы хотите получить доступ следующим образом
value = .Fields("BinaryColumn").Value(0)
Ответ №1:
Несмотря на то, что это вариант, в нем все еще есть встроенный тип. Пожалуйста, обратите внимание на изображение окна просмотра VB6:
Несмотря на то, что выражение является вариантом, тип внутри варианта все еще четко определен (в данном случае string). Таким образом, VB не может просто преобразовать массив байтов в байт только потому, что в нем есть только один элемент. Поведение, демонстрируемое вашим фрагментом кода, совершенно нормально.