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

Posted

技术标签:

【中文标题】MS Access 错误“ODBC--调用失败。转换规范 (#0) 的字符值无效”【英文标题】:MS Access error "ODBC--call failed. Invalid character value for cast specification (#0)" 【发布时间】:2009-10-05 23:35:57 【问题描述】:

有谁知道这个错误是什么意思或如何解决它?我正在使用 Access 2003 和 SQL2005。尝试在特定子表单上添加记录时出现。

[Microsoft][SQL Native Client] 转换规范的字符值无效 (#0)

This MS bug report 描述了相同的消息,但它是 SQL Server 6.5 中的一个错误,已经解决。

已解决: 显然目标表上没有 PK 是导致此问题的原因,它与子表单或 Access 中的查询没有任何关系。 我什至不知道这个数据库中有没有 PK 的表。将 PK 添加到目标表解决了它。奇怪的是,通过 SQL 本地客户端执行时出错的查询字符串与通过 SSMS 执行时没有错误的查询字符串相同。希望这可以帮助遇到这个奇怪信息的其他人。

【问题讨论】:

【参考方案1】:

嗯,我会检查访问侧的默认文本框。我还将在设计模式下调出链接表,并且您想检查 ms-access 在此处假定的数据类型。对于不支持的数据类型,ms-access 通常会使用一个字符串,而 sql server 可能需要别的东西。

因此,检查主表中的主键 (PK),然后检查外键 (FK) 列在子表中使用(假定)的数据类型。在此过程中,请检查用于子表单控件中的子/主链接设置的表达式(不是表单,不是子表单,而是链接这两个表的表单中使用的子表单控件)。

如果您在 sql server 表中没有时间戳列,则访问中的子表单是敏感的。如前所述,检查 PK 和 FK 数据类型并确保它们匹配(只需在 ms-access 中以设计模式调出表——您会收到有关设计模式为只读的错误消息,但请继续,以便您可以检查/查看以确保数据类型匹配)。

所以对于子表,你需要一个PK,一个FK,还有一个时间戳列(你不必在子表单中显示TS列,但你需要在表中)。

ms-access 中的子表单很敏感,如果您在 sql 表中不包含时间戳列,则通常会失败。 (访问使用这些行版本列来确定数据是否已更改)。

【讨论】:

你是对的.. 2小时后..这是因为子表没有PK.. grr! 为了第二个 Albert 的好答案,我只想说我刚刚在 SQL Server 中将它作为一种做法,理所当然地在每个表中包含一个时间戳字段 - 它只是让事情变得更容易.在任何数据库引擎中,我永远不会有没有 PK 的表,所以这不是我需要强迫自己遵循的规则!【参考方案2】:

视图中的某个字段是否使用 CAST 函数计算/构建?在这种情况下,您可能无权更新/添加该字段的值。

你能在 MS SQL Studio 界面中执行你的视图并尝试插入一条记录吗?

【讨论】:

嗨,我不知道实际执行的是什么。在表单本身上插入记录可以正常工作,但是当该表单是子表单时尝试插入它会导致此错误。子表单只插入一个文本值,没有函数,没有 vba。 在我看来,你得到的消息意味着视图在某处使用了CAST函数来计算字段中的值,因此无法更新对应的字段。如果问题是特定于子表单的,那么表单和子表单之间的链接,或者子表单记录集的主键,可能会建立在这个计算值之上。 我现在正在查看 SQL Profiler 实际发生的情况,感谢您告诉我这件事,我不敢相信我以前什至不知道这一点。 好的,我发现使用 SQL Profiler 执行的语句只是使用 sp_executesql 的普通插入,将其粘贴到 SSMS 中并且运行没有问题(1 行受影响)。其他具有相同类型插入语句的子窗体在 MS Access 中执行良好,所以我只是试图缩小导致该语句失败的差异。任何地方都没有 CAST 函数。【参考方案3】:

此问题的另一个原因是,如果您在不更改视图的情况下更改表名,则该视图的“依赖项”仍会使用表的旧名称。

假设我有一个表“A”和一个从“A”派生的视图“Av”,我创建了一个名为“A”的新表,我将“A”的名称更改为“A_old”,但我未执行 ALTER VIEW,因此“Av”的依赖关系仍保留在“A_old”上,但视图派生自“A”,并且在尝试将视图打开为链接表时导致 Access 中出现此错误

【讨论】:

【参考方案4】:

我刚刚花了一天时间与一个 Access ADP 项目作斗争,该项目被导入到一个新的 Access 2016 ACCDB 文件中。最初我认为这是应用程序代码的问题,但我将这些键控记录直接放入表中。有趣的是,记录总是被写入——这似乎是触发错误的回读。分析插入 sql 并从 SQL Management Studio 运行它没有任何问题。

导致问题的表有一个 GUID 主键。将其切换为 int 列解决了该问题。

SQL 数据库还散布着几千个扩展属性,我在切换 PK 之前删除了这些属性。网络上有一个强烈的建议,即这些会导致问题。该过程的来源记录在这里:Remove All SQL Extended Properties

【讨论】:

【参考方案5】:

我在尝试更新 ODBC 链接的 SQL Server 数据库时遇到了 Access 2016 的问题。问题是用于连接两个表的字段中的空值。消除空值解决了问题

【讨论】:

【参考方案6】:

好的,我只是有这种糟糕的经历,它与 PK 或任何这些东西无关在我的情况下。在 Access 中报告此问题的视图最初是在 SQL Server 中创建并使用的将 DATETIME 转换为普通的旧 DATE 以消除不需要的时间部分。直到今天,此视图已在 Access 中引起 0 个问题,但如上所述开始产生胃灼热。

因此,我为 MSS 视图生成了一个 Drop/Create 脚本,运行它,重新链接 Access 中的视图,Access 数据库对结果感到满意。我在Access中所有所谓的表格基本上都是通过链接到MSS进行报告的视图。我只有 1 个实际进行更改的表。除此之外,我不会通过 Access 中的视图进行编辑。

该消息当然像往常一样无用,但这是我在我的情况下的解决方案。

【讨论】:

【参考方案7】:

仅根据您在上面提供的消息,您似乎正在尝试为某些字段或参数等设置无效值...该消息告诉您它正在尝试将值转换为特定数据类型,但该数据类型的值无效...有意义吗?

请添加更多详细信息,以便我们更好地为您提供帮助。

【讨论】:

以上是关于MS Access 错误“ODBC--调用失败。转换规范 (#0) 的字符值无效”的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 打开错误消息

加入时更新 MS Access 语法错误

ASP.NET - MS-ACCESS - VB.NET - SQL 语句错误

MS Access sql错误查询

MS Access SQL 语法错误

库存 SQL 查询出现歧义错误,其中两个字段应相等以进行计算。 MS-ACCESS