忽略的 MaxScanRows 设置可能引起链接表中的数据类型不正确

来源:互联网 时间:2016-01-03

症状运行 Visual Basic for Applications 代码从文本文件创建链接表之后,您会发现在一个或多个记录中出现 #_Num!。 原因下列陈述中的一个或两个都为真: 下列注册表项设为零: HKLM\Software\Microsoft\Jet\4.0\Engines\Text\MaxScanRows

您有带有下列条目的 Schema.ini 文件: MaxScanRows=0

如果将 MaxScanRows 设为零,则无论是在注册表中还是在 Schema.ini 文件中,以编程方式链接的任何表都有可能包含数据类型不正确的字段。这是因为,将 MaxScanRows 设为零会引起对整个表进行扫描,以便确定字段的数据类型。当发生这种情况时,数据类型是根据字段中的大多数类型来设置的。因此,如果大多数字段包含数字,而一些字段包含文字,例如,在 Access 中字段定义为具有“数字”的数据类型,使得文本项显示 #_Num!。 解决方案如果您使用文本导入向导进行链接,就不会发生这一问题。但是,如果您必须用代码创建链接,就可以在 Schema.ini 文件中为一个或多个字段定义数据类型。在下列举例中,第一列设为字符数据类型: [Test.txt] Format=CSVDelimited ColNameHeader=false MaxScanRows=0 CharacterSet=ANSI Col1=ID Char Width 3 状态Microsoft 已经确认这是本文开头所列出的 Microsoft 产品本身的问题。 更多信息备注:本文中的示例代码使用 Microsoft 数据访问对象。为使该代码正常运行,您必须引用 Microsoft DAO 3.6 Object Library。为此,要在 Visual Basic 编辑器中单击工具菜单上的引用,并确保选中 Microsoft DAO 3.6 Object Library 复选框。

重现问题的步骤

在驱动器 C 的根目录中创建名为 Test 的文件夹。 在记事本中,创建名为 Test.txt 的文本文件,并输入下列数据。然后,将文件保存在 C:\Test 文件夹中。 a b 1 2 3 在记事本中,创建第二个文件,并输入下列数据: [Test.txt] Format=CSVDelimited ColNameHeader=false MaxScanRows=0 CharacterSet=ANSI 在记事本的文件菜单上,单击另存为。在保存类型框中,单击所有文件,然后将文件保存为 C:\Test\Schema.ini。 创建新的 Access 数据库,然后创建新的 Visual Basic for Applications 模块。 将下列函数输入该模块: Function LinkSchema() Dim db As DAO.Database, tbl As DAO.TableDef Set db = CurrentDb() Set tbl = db.CreateTableDef("Test") tbl.Connect = "Text;DATABASE=c:\Test;TABLE=Test.txt" tbl.SourceTableName = "Test.txt" db.TableDefs.Append tbl db.TableDefs.Refresh End Function 在“立即”窗口中键入以下行,然后按 ENTER 键: ?LinkSchema()

关闭 Visual Basic 编辑器,然后返回到 Access。 打开最新链接的表 Test。 请注意,开头两个记录中出现了 #_Num!。

相关阅读:
Top