【问题标题】:Select query truncates numeric data greater than 10 digits选择查询截断大于 10 位的数字数据
【发布时间】:2016-04-11 14:38:33
【问题描述】:

几天来我一直在尝试解决这个问题,但没有成功。非常感谢任何帮助

我正在尝试将 csv 文件导入 Access 数据库,但数字列中的一些数据被截断。

我的机器上没有安装 MS Access(只有 Windows 预装的 jet 数据库引擎 (msjet40.dll and msjetoledb40.dll))。但除了这个问题,其他一切都很好。我在连接字符串中使用Provider=Microsoft.ACE.OLEDB.12.0

csv 文件在文件中包含数字列和非数字列。只要有问题的数字列的值小于2140649050 左右,它就可以选择。

SELECT * into ds1 FROM [Text;FMT=Delimited;HDR=YES;DATABASE=" & LFPath & "].[" & LFName & "]

最初我假设在将数据加载到表时会发生数据截断。但是数据在选择本身时被截断。以下选择查询返回为 UPC 列截断的部分数据

SELECT HeadName,[upc code],len([upc code]) as maxlen  FROM [Text;FMT=Delimited;HDR=YES;DATABASE=" & LFPath & "].[" & LFName & "]

这是相同的输出

HeadName    upc code    maxlen
TOTAL U.S   2140649030  10
TOTAL U.S   2140649050  10
TOTAL U.S   2140649050  10
TOTAL U.S       
TOTAL U.S       
TOTAL U.S       
TOTAL U.S       
TOTAL U.S       

似乎它根据最初的几条记录设置了列的最大长度。我怎样才能阻止它这样做。

之所以选择 Access,是因为该工具无需额外设置即可在 Windows 中运行。

安装 MS Access 时数据不会被截断(使用 Access 2010 测试)。这是否意味着 ACE.OLEDB.12 与最新的 ACE 引擎 ACECORE.dll (wiki) 配合使用效果更好

请提出解决问题的任何可能性,而无需安装其他版本的数据库的额外负担

【问题讨论】:

  • 尝试使用schema.ini 文件来明确定义列类型应该是什么。看起来 Text 驱动程序假设该列是 Long Integer 并截断超过有符号 32 位整数 (~2.1E9) 的最大值的值。
  • 数据文件的列数不固定。所以我现在看到的唯一选择是根据此列按降序对文件进行排序,然后加载。但我想知道是否可以从 vba 中对实际的 csv 文件本身进行排序

标签: csv ms-access ms-jet-ace


【解决方案1】:

您可以尝试将单元格格式化为通用格式吗?那么可能是您的数据不会被截断。

【讨论】:

  • 该文件将具有不同的列数,这限制了修复文件中的问题
【解决方案2】:

据我所见和研究,我发现了 2 个可以选择的选项。两者都涉及额外的步骤。

第一个选项是按列的降序对 csv 文件进行排序。在我的情况下,只有一列被截断。所以我可以根据特定列按降序对列表进行排序,并且数据会被插入而不被截断。 (找不到以编程方式对文件进行排序的自动化解决方案。因此我们需要手动对文件进行排序,然后加载到数据库中)

另一个选项是将 csv 文件转换为 excel 文件并使用它来加载数据。这是相同的SO Post

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多