无法更改 MS Access 2007 上的数据类型

Posted

技术标签:

【中文标题】无法更改 MS Access 2007 上的数据类型【英文标题】:Can't change data type on MS Access 2007 【发布时间】:2010-03-11 22:09:05 【问题描述】:

我有一个巨大的数据库 (800MB),其中包含一个名为“上次修改日期”的字段,此时该字段作为文本数据类型输入,但需要将其更改为日期/时间字段以执行一些查询.

我有另一个完全相同的数据库,但里面只有 35MB 的数据,当我更改数据类型时它工作正常,但是当我尝试更改大型数据库上的数据类型时,它给了我一个错误:

Micorosoft Office Access can't change the data type.

There isn't enough disk space or memory

在做了一些研究后,一些提到更改注册表文件 (MaxLocksPerFile) 的网站也尝试过,但没有运气:-(

有人可以帮忙吗?

【问题讨论】:

您是否尝试过创建一个具有相同字段的新表,除了“上次修改日期”是日期时间类型。这个新表不应该有任何索引。使用追加查询将数据追加到新表中。 抱歉不太清楚您所说的索引是什么意思:s 数据在我用来导入 Access 的 CSV 文件中,它也没有让我设置数据类型,导入时也出现同样的问题水平。 如果你不知道索引是什么,你可能没有:) 请发布两三个日期以显示格式,谢谢。 【参考方案1】:

作为John W. Vinson says here,您遇到的问题是 Access 在进行更改时想要保留表的副本,这导致它超过了 Access 文件的最大允许大小。压缩和修复可能有助于使文件低于大小限制,但它对我不起作用。

如果像我一样,您在旧表上有很多复杂的关系和报告不想重做,请尝试使用@user292452 的解决方案的这种变体:

    复制表格(即'YourTable'),然后将“仅结构”粘贴回去 使用不同的名称(即'YourTable_new')进入您的数据库。 再次复制YourTable,并将数据粘贴并附加到YourTable_new。 (要粘贴-追加,首先粘贴,然后选择将数据追加到现有 表。) 此时您可能想要制作 Access 数据库的副本, 以防下一部分出现问题。 使用删除查询删除YourTable中的所有数据---全选 字段,使用星号,然后使用默认设置运行。 现在您可以根据需要更改YourTable 中的字段并保存 再次。 将YourTable_new中的数据粘贴附加到YourTable,然后检查 没有类型转换、长度等方面的错误。 删除YourTable_new

【讨论】:

在第 5 步中,您编辑 original 表,不是吗?【参考方案2】:

一个相对乏味(但简单)的解决方案是将大数据库分解为较小的数据库,在较小的数据库上进行转换,然后重新组合它们。

这还有一个额外的好处,即如果有机会,文本在一个块中是无效日期,它会更容易找到(因为块大小更小)。

假设您在表上有某种整数键,范围从 1 到(例如)10000000,您可以执行类似的查询

SELECT *
INTO newTable1
FROM yourtable
WHERE yourkey >= 0 AND yourkey < 1000000

SELECT *
INTO newTable2
FROM yourtable
WHERE yourkey >= 1000000 AND yourkey < 2000000

等等

确保分别输入和运行这些查询,因为如果您尝试一次运行多个查询,Access 似乎会给您一个语法错误。

如果你的键是别的东西,你可以做同样的事情,但你必须对你的 WHERE 子句更加棘手。

当然,最后要考虑的事情是迁移到功能更强大的不同数据库。我猜您有理由认为这并不容易,但是您所谈论的数据量很大,您可能会遇到其他问题以及继续使用 Access。

编辑

由于您仍然遇到一些麻烦,这里有一些更详细的信息,希望您能看到我之前描述得不够清楚的东西:

在这里,您可以看到我创建了一个类似于您所描述的表“OutputIDrive”。我有一个 ID 标签,虽然我只有三个条目。

在这里,我创建了一个查询,进入 SQL 模式,并输入了适当的 SQL 语句。就我而言,因为我的查询只获取 >= 0 和

当我单击运行按钮时,我会看到一个弹出窗口,告诉/警告我会发生什么……它将在新表中放入一行。很好……这就是我们正在寻找的。我点击“确定”。

现在我们的新表已经创建好了,当我点击它时,我们可以看到我们的一行ID=1的数据已经被复制到了这个新表中。

现在您应该可以只修改 SQL 查询中的表名和数字值,然后再次运行它。

希望这将帮助您解决任何绊倒您的问题。

编辑 2:

啊哈!这就是诀窍。您必须在 Access 中一次输入并运行一条 SQL 语句。如果您尝试将多个语句放入并运行它们,您将收到该错误。所以运行第一个,然后擦除它并运行第二个,等等,你应该没问题。我认为那会做到的!我已经编辑了上面的内容以使其更清晰。

【讨论】:

抱歉,我是个 SQL 新手。我的表名为“OutputIDrive”,mykey 为“ID”,范围为 0 > 1325210 如何将其放入 SQL 中?我尝试更改上面的源代码,但得到“查询表达式中的语法错误 'ID >=0 AND ID 【参考方案3】:

改编自 MSDN 帖子上的 Karl Donaubauer's answer:

切换到即时窗口 (Ctl + G)

执行以下语句:

DBEngine.SetOption dbMaxLocksPerFile, 200000


微软有一个KnowledgeBase article 直接解决了这个问题并描述了原因:

事务所需的页锁超过 MaxLocksPerFile 值,默认为 9500 个锁。 MaxLocksPerFile 设置存储在 Windows 注册表中。

知识库文章说它适用于 Access 2002 和 2003,但在从 Access 2013 更改 .mdb 中的字段时它对我有用。

【讨论】:

【参考方案4】:

完全有可能在这种大小的数据库中,您的文本数据无法转换为有效的日期/时间。

我建议(您可能会因此而讨厌我)从“Big”中导出所有这些预期的日期值并检查它们(可能在 Excel 中)以查看哪些未按您期望的方式格式化。

【讨论】:

很有趣,我真的有! :( 数据库里面的数据是自动生成的,肯定都是日期类型的。至于excel,一开始我尝试用Excel打开,但是Excel有最大单元格数,我觉得120万左右,这个数据过了一遍:( 我可以建议将您的数据从 Access 迁移到 SQL Express 中吗? Access 信任的数据量非常庞大。 这将是一个好主意,但是对于 Access 以外的任何数据库,我都是一个新手,但如果有一个简单的步骤可以将此数据库转换为 SQL,那就太好了。 访问有 2gb 的限制,800mb 并不是一个疯狂的数据量。我认为如果熟悉的话,继续使用 Access 会更安全,除非您,khalidfazeli,预计数据量会增加一倍以上。 从现在开始,数据量不会再改变,只需要一些不应该超过 200mb 的查询。【参考方案5】:

假设错误消息准确无误,您将遇到磁盘或内存限制。假设您的磁盘驱动器上有超过几 GB 的可用空间,我最好的猜测是重建表会使数据库(包括工作空间)超过 Access 中每个文件 2 GB 的限制。

如果是这种情况,您需要:

    将数据卸载为某种方便的格式,然后将其重新加载到具有现有表定义的空数据库中。

    将数据的子集移动到小表中,改变小表中的数据类型,压缩修复数据库,重复直到所有数据都转换完毕。

如果错误消息不正确(这是可能的),最可能的原因是您的文本日期列中的日期错误或超出范围。

【讨论】:

【参考方案6】:

    复制表(即“YourTable”),然后将其结构以不同的名称(即“YourTable_new”)粘贴回您的数据库中。

    将新表中的字段更改为您想要的并保存。

    创建追加查询并将旧表中的所有数据复制到新表中。

希望 Access 会自动将旧文本字段直接转换为新日期/时间字段的正确值。如果没有,您可能必须清除旧表并重新附加所有数据,并在执行附加时使用字符串到日期函数来转换该字段。

此外,如果旧表中有自动编号字段,这可能不起作用,因为无法确保旧的自动编号值与分配的新自动编号值一致。

【讨论】:

嗯?当然,您可以保持相同的自动编号值。只需将旧的自动编号字段附加到新的自动编号字段即可。 Jet/ACE Autonumber 数据类型只是一个具有特殊类型默认值的 Long Integer 字段(以及一些其他限制,例如创建记录后不可编辑),因此您可以将任何值附加到字段中新记录,只要它不违反现有数据的索引即可。【参考方案7】:

我们为您提供了许多不同的方法来绕过磁盘空间错误消息。

您是否尝试过使用日期数据类型向现有表中添加新字段,然后使用现有字符串日期字段的值更新该字段?如果可行,您可以删除旧字段并将新字段重命名为旧名称。与在单个字段上直接从字符串转换为日期相比,这可能会占用更少的临时空间。

如果它仍然不起作用,您可以使用带有两列的 sceond 表来完成,第一个长整数(使其成为主键),第二个,日期。然后将 PK 和字符串日期字段附加到此空表。然后将新的日期字段添加到现有表中,并使用连接,使用两列表中的值更新新字段。

这可能会遇到同样的问题。这取决于我们无法真正控制的 Jet/ACE 数据库引擎内部事物的数量。

【讨论】:

以上是关于无法更改 MS Access 2007 上的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 MS Access 2007 访问 ODBC DB

MS Access 2007 OpenForm 方法,无法获取 where 子句以产生正确的结果

MS Access 2007 重命名自定义组中的快捷方式以更改对象的名称

MS-Access 2007 - 如何在点击事件中以编程方式访问子表单列数据

使用 ODBC 链接到 MySql 时,MS Access 表单不刷新

选项卡式控件上的 MS Access 2007 引用子窗体控件返回 null