无法更改 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 - 如何在点击事件中以编程方式访问子表单列数据