如果在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自由策略我会想到这样的东西会起作用。
有人可以解释为什么会失败吗?
答案 0 :(得分:1)
即使它是一个变体,它仍然嵌入了它的类型。请注意VB6观察窗口的图像:
即使表达式是变体,变体内部的类型仍然定义良好(在本例中为字符串)。因此VB不能仅仅因为其中只有一个元素而将字节数组转换为字节。您的代码段显示的行为完全正常。