VB6 MS-Access returns 错误 'AllowZeroLength' 值

VB6 MS-Access returns wrong 'AllowZeroLength' value

我将 VB6 与 ADOX 结合使用来检查 Access 97 table 列的属性。 对于文本字段,重要的是要证明该字段是否允许零长度。

问题:returned 值被反转。 如果字段允许零长度,则 return 为 false,如果字段不允许,则值为 true。

如果一个字段不支持这个 属性 它 return 是错误的,这是正确的。

有人可以解释为什么 return 是倒置的吗?

Private Sub ReadTableStructure()
    Dim Cat As ADOX.Catalog
    Dim Tbl As ADOX.Table
    Dim Col As ADOX.Column

    Set Cat = New ADOX.Catalog
    Set Cat.ActiveConnection = Conn

    For Each Tbl In Cat.Tables
        For Each Col In Tbl.Columns
            bAllowZeroLength = GetDBPropertyBool(Col.Properties, "Jet OLEDB:Allow Zero Length", True)
        Next Col
    Next Tbl
End Sub

函数 GetDBPropertyBool:

Private Function GetDBPropertyBool(Properties As ADOX.Properties, sName As String, bDefaultValue As Boolean) As Boolean
    Dim Prop As ADOX.Property

    Set Prop = Properties(sName)
    If Prop Is Nothing Then
        GetDBPropertyBool = bDefaultValue
    Else
        GetDBPropertyBool = Prop.Value
    End If
End Function

在 Access 中此 属性 为真,在 VB6 对象中为假。

编辑: 我刚刚发现,当我在 Access 中以编辑模式打开 table 并保存时,VB6 中给出的值是正确的。我不做任何更改,只是打开编辑并保存。有没有人已经有这个问题?

实际上我没有找到答案,为什么我得到这些错误的值。 打开和保存每个 table 对我们和我们的客户来说都不是解决方案。

我刚刚找到了一个解决方法,使用 DAO 正确读取 属性。

Private Sub ReadTableStructure(DB As DAO.Database)
    Dim i As Integer, j As Integer
    Dim Fld As DAO.Field
    Dim tdfLoop As TableDef

    For i = 0 To DB.TableDefs.Count - 1
        Set tdfLoop = DB(i)   
        For j = 0 To tdfLoop.Fields.Count - 1
            bAllowZeroLength = tdfLoop.Fields(j).AllowZeroLength
        Next j
    Next i
End Sub

如果有人得到答案,为什么 ADO 没有 returns 正确的值,请告诉我。