Получение двоичных данных из SQL в VB6 - PullRequest
0 голосов
/ 12 мая 2011

Если у вас есть столбец типа двоичный в 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 () и вы пытаетесь установить байт!».

Мой аргумент - Fields.Value - это свойство типа Variant, и, учитывая либеральную политику VB6 в отношении типов, я бы подумал, что это будет работать.

Может ли кто-нибудь объяснить, почему это не удается?

1 Ответ

1 голос
/ 14 мая 2011

Несмотря на то, что это вариант, в него все равно встроен тип. Обратите внимание на изображение окна просмотра VB6:

enter image description here

Несмотря на то, что выражение является вариантом, тип внутри варианта все еще хорошо определен (в данном случае строка). Таким образом, VB не может просто преобразовать байтовый массив в байт только потому, что в нем есть только один элемент. Поведение, демонстрируемое вашим фрагментом кода, совершенно нормально.

...