从recordset.field.type 属性中获取ADO 数据类型的名称?

Posted

技术标签:

【中文标题】从recordset.field.type 属性中获取ADO 数据类型的名称?【英文标题】:Get the name of an ADO data type from the recordset.field.type property? 【发布时间】:2013-11-01 21:26:01 【问题描述】:

我需要从 Access 表中生成字段列表(名称、类型和大小)。这个简单的 VB 代码给了我几乎我需要的东西:

Set rs = CurrentDb.OpenRecordset("myTable")
For x = 0 To rs.Fields.Count - 1
    Print #1, rs.Fields(x).Name & vbTab & rs.Fields(x).Type & vbTab & rs.Fields(x).Size
Next 

但是,“类型”当然是​​像“10”这样的数字常量,而不是像“Varchar”这样的东西。

我打算这样做:

Select Case rs.Fields(x).Type
  Case adChar
    fieldType = "adChar"
  Case adInteger
    fieldType = "adInteger"
  Case adDouble
ETCETERA....

但我想知道是否有更好的方法,比如 DataTypeEnum.FindName(Type) 之类的?

如果这是一个“愚蠢的问题”,请提前道歉,但我不是每天都在 VB 中工作,谷歌搜索对此没有明确的答案。

【问题讨论】:

这不是一个愚蠢的问题。试试Debug.Print TypeName(rs.Fields(x)), VarType(rs.Fields(x)) 我还没有测试过但试一试 没有简单的方法可以将(在 VBA 中)枚举值转换为其等效的“名称”。你拥有它的方式几乎就是你如何做到的。 艾伦布朗有一个很好的page listing the constants,他甚至还有一个FieldTypeName(在那个页面上向下滚动一点)功能,但你可能仍然需要自己动手才能得到确切的结果你想要的。 @mehow - 感谢您的快速响应,我最终得到的结果是 TypeName(rs.Fields(x).Value),它给了我所需的 90% (它报告了两个“货币”字段为“空”,但我可以忍受。)再次感谢。 @user1071914 - 如果值为空,它将报告“空”。您这样做的方式不是检查字段/列 ADO 类型,而是检查字段/列中值的 VBA 类型。诚然,这里的区别在纯 Access 上下文中有点学术性(ADO 和 VBA 类型系统之间的映射非常直接,而且 Access 作为数据库引擎并不像 SQLite 那样使用动态类型)。 【参考方案1】:

问题(上)下的 cmets 中的答案非常好,不幸的是,它们归结为“你无法从这里到达那里”。没有简单的方法可以在字段中获取包含的数据类型。我能做到的最接近的就是为快速而肮脏的人做这个:

Function Scripting()
    Dim rs As DAO.Recordset
    Dim ff As String
    Dim fieldType As String
    ff = "c:\Users\me\Desktop\Structure.txt"
    Open ff For Output As #1
    Set rs = CurrentDb.OpenRecordset("myTable")
    For x = 0 To rs.Fields.Count - 1
        Print #1, rs.Fields(x).Name & vbTab & TypeName(rs.Fields(x).Value) & vbTab & rs.Fields(x).Size
    Next
    Close #1
    rs.Close
    Set rs = Nothing
End Function

建议您访问Allen Browne 的优秀页面并获取他的 FieldTypeName() 函数以获得更好的解决方案。

感谢所有提供答案的人(mehow、blackhawk、Chris Rolliston 和 Tim Williams)。

【讨论】:

以上是关于从recordset.field.type 属性中获取ADO 数据类型的名称?的主要内容,如果未能解决你的问题,请参考以下文章

从一个属性中提取价值到另一个属性中

如何通过asp.net核心中的属性名称从模型中获取验证属性

从类型中排除属性

在 C# 中使用 Linq 从 XML 获取属性和属性

为啥从类和实例中获取属性的查找过程不同?

从 HTML 标记中删除某些属性