访问 2000 - 强制转换规范 (#0) 的无效字符值 - 访问 SQL
Posted
技术标签:
【中文标题】访问 2000 - 强制转换规范 (#0) 的无效字符值 - 访问 SQL【英文标题】:Access 2000 - invalid character value for cast specification (#0) - Access to SQL 【发布时间】:2015-09-28 09:01:37 【问题描述】:最近我已将我的 Access 2000 后端数据和表迁移到 2012 SQL 服务器。在访问前端,我已经链接了迁移的 SQL 表。除了(现在)一种形式外,其中大部分工作正常。
在此表单中,数据正在使用此查询从 SQL 服务器加载:
SELECT * FROM qryAbonementens WHERE EindDatum is null or EindDatum>=now()
它还使用了过滤和排序:
((Lookup_cmbOrderNummer.Omschrijving="GJK"))
还有排序:
Lookup_cmbOrderNummer.Omschrijving
这些东西可能无关紧要,但我会尽可能多地发布。
表格中的数据完美加载,但是当我尝试更改表格中的记录时,我不断收到:
类型转换规范的错误无效字符值 (#0)
在查看有同样问题的帖子时,我遇到了这个帖子:
MS Access error "ODBC--call failed. Invalid character value for cast specification (#0)"
这让我相信我在某处遗漏了一个 PK 所以首先我在 Access 设计模式下检查了链接表:
Tekst = 文本,Numeriek = 数字,Datum/tijd = 日期(抱歉是荷兰语)。
SQL 中的同一张表如下所示:
他们都有PK所以我想这不是问题。
不过,在查看这两种数据类型时,您可以在 InkoopPrijs
和 VerkoopPrijs
字段上看到 2 个差异。在 SQL 中,这两个是 decimals(30,2)
,而在链接访问表的设计视图中,我猜它们是未知的,因此它们被转换为 text
值。也许这是我的错误消息的原因?
我正在尝试更改并给出错误的记录是这个(但它在所有记录上):
我在某处读到,将时间戳字段添加到 SQL 服务器可能会有所帮助,但我不知道它也适用于我的情况或如何执行此操作。
【问题讨论】:
【参考方案1】:如您所料,decimal(30, 2)
列是问题所在。
它们太大,无法将 Access 用作数字。
我可以使用 Access 2010 重现该问题,尽管我可以在字段中输入数字数据。但是当我输入文本时,我会收到完全相同的错误消息。
decimal(18,2)
工作正常(这是 Sql Server 2008 的默认十进制精度)。
你肯定没有 10^30 范围内的价格吗? :-)
您也可以考虑改用 money
数据类型,尽管我不知道 Access 2000 使用它的效果如何。
【讨论】:
感谢您的意见,但它不起作用。我将 SQL 服务器中的数据类型更改为Decimal(18,2)
而不是 30,2
。但这并没有任何影响。我现在收到错误消息:scaling of numbers has resulted in cutting of values
。这导致我现在有很多或#error
值(所以我想我需要30,2)?除此之外,我还收到了while you changed the record, the record has been changed by an other user, if you save your record the changes will be overwritten
。保存记录虽然是灰色的..
P.S.当我将小数点的SQL长度更改为18,2
时,访问链接表从文本更改为numeric
(decimal 18,2
)
@Nicolas:您在何时何地收到缩放错误?您实际上在该表中是否有小数点前 > 18 位的数字?
在我重新打开表单之后。但奇怪的是我没有任何大的值......最大的大约是 5 个数字。
缩放错误似乎只发生在虚拟值上(虽然不确定,因为它们不断弹出)。但是,如果我更新正常记录,则会收到前面描述的保存错误。【参考方案2】:
好的,我把它修好了。 @Andre451 关于将 SQL 服务器中的 30,2 十进制值更改为 18,2 的帖子给了我 the record is changed by another user
错误。这导致我对问题的看法不同,而不是修复
类型转换规范的错误无效字符值 (#0)
错误我看了
记录被另一个用户错误更改
我看到了这个帖子:Linked Access DB "record has been changed by another user"
这里有人建议在 SQL 表中添加一个时间戳字段。所以我做到了,现在它似乎又可以工作了!而且它似乎也适用于原始(十进制 30,2)值!
【讨论】:
以上是关于访问 2000 - 强制转换规范 (#0) 的无效字符值 - 访问 SQL的主要内容,如果未能解决你的问题,请参考以下文章
(fast_executemany = True) 错误“[ODBC Driver 17 for SQL Server]强制转换规范 (0) (SQLExecute)'的字符值无效”)
MS Access 错误“ODBC--调用失败。转换规范 (#0) 的字符值无效”