Извлечение двоичных данных из SQL в VB6

#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 не может просто преобразовать массив байтов в байт только потому, что в нем есть только один элемент. Поведение, демонстрируемое вашим фрагментом кода, совершенно нормально.