访问 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所以我想这不是问题。

不过,在查看这两种数据类型时,您可以在 InkoopPrijsVerkoopPrijs 字段上看到 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时,访问链接表从文本更改为numericdecimal 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)'的字符值无效”)

DataReader:指定的强制转换无效 (Int32)

MS Access 错误“ODBC--调用失败。转换规范 (#0) 的字符值无效”

通过 UCanAccess 插入时出现“强制转换的字符值无效”错误

指定的强制转换无效错误

C# 的无效强制转换异常