在VB6中从SQL中检索二进制数据

时间:2011-05-12 05:35:08

标签: arrays vb6 casting byte bytearray

如果在SQL中有一个二进制类型的列并在VB6中使用ADODB返回它,即使该列只包含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是Type Variant的一个属性,并且在类型转换时给出了VB6s自由策略我会想到这样的东西会起作用。

有人可以解释为什么会失败吗?

1 个答案:

答案 0 :(得分:1)

即使它是一个变体,它仍然嵌入了它的类型。请注意VB6观察窗口的图像:

enter image description here

即使表达式是变体,变体内部的类型仍然定义良好(在本例中为字符串)。因此VB不能仅仅因为其中只有一个元素而将字节数组转换为字节。您的代码段显示的行为完全正常。