【发布时间】:2019-05-08 08:08:24
【问题描述】:
这是我获取用于通过 ODBC 访问的 SQL-Server 表的 varchar 字段大小的函数:
Function fn_field_size(par_tab, par_field As Variant) As Variant
Dim db_tab As DAO.Database
Dim tab_tab As DAO.TableDef
Dim tab_field As DAO.field
fn_field_size = 0
Set db_tab = CurrentDb()
Set tab_tab = db_tab.TableDefs(par_tab)
Set tab_field = tab_tab.Fields(par_field)
fn_field_size = tab_field.Size
Set tab_tab = Nothing
Set db_tab = Nothing
End Function
在我将该函数用于 varchar(1000) 字段之前,它似乎工作正常。在这种情况下,tab_field.Size 为 0。对于 Varchar(100) 等较小的字段,该函数可以正常工作并返回 100。
这是为什么?
【问题讨论】:
-
DAO 是必需的吗?我会尝试看看 ADO 是否更有意义。也就是说,根据documentation,您从
DAO.Field.Size获得的值是最大 大小,以字节为单位。由于 AccessText字段最多只能包含 255 个字符(510 个字节?),我怀疑 DAO 可能将varchar(1000)视为一些Memo字段,其中Field.Size始终为 0。你会得到什么对于varchar(510)与varchar(512)? -
@MathieuGuindon 是正确的,Access 数据库引擎会将 255 个字符或更少的字符解释为
Text(或在较新版本中为Short Text)以及更多为Memo(或在较新版本中为Long Text) )。数据访问库 (DAO/ADO) 对此没有发言权,因为 Access 数据库引擎将如何使用其数据类型系统解释链接表。 -
我不确定是否需要 DAO。 DAO 和 ADO 有什么区别?我可以只在这个函数中使用 ADO 吗?
-
相当肯定跳过链接表/访问内容并打开带有连接字符串的
Recordset直接到 SQL Server,将为您提供正确的元数据。 -
Access 没有
VARCHAR(1000)字段的概念。所有文本字段均为 UTF-16,所有接受超过 255 个字符的字段都被解释为 Long Text。您需要在服务器上查找字段大小,并且可以使用 ADOX 来完成。我可以写一个答案,但通常你希望有可重用的逻辑来设置 ADODB 连接。您还可以使用直通查询从 SQL Server 查询信息。