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

问题描述:

有没有人知道这个错误意味着什么或如何解决它?我正在使用Access 2003和SQL2005。它试图在特定的子表单上添加记录时出现。MS Access错误“ODBC - 调用失败。铸造规范(#0)的字符值无效”

[微软] [SQL本机客户端]流延规范无效字符值(#0)

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

已解决:显然目标表上没有PK导致这种情况,它与子窗体或Access查询没有任何关系。 我甚至没有意识到这个数据库中没有PK。将PK添加到目标表解决了它。奇怪的是当通过SQL本地客户端执行时出现错误的相同查询字符串,通过SSMS执行而没有错误。希望这可以帮助那些遇到过这种奇怪信息的人。

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

因此,请检查主表中的主键(PK),然后检查子表中用于(假设)外键(FK)列的数据类型。虽然我们在此,请检查用于子窗体控件中子/主链接设置的表达式(不是表单,而是子表单,但是表单中使用的子表单控件将这两个表链接起来)。

如果您在sql服务器表中没有时间戳列,则访问中的子窗体很敏感。如上所述,检查PK和FK数据类型并确保它们匹配(只需在设计模式下在ms-access中调出表格 - 您将看到关于设计模式仅为只读的错误消息,但只需继续即可可以检查/查看以确保数据类型匹配)。因此,对于子表,您需要一个PK,一个FK和一个时间戳列(您不必在子表单中显示TS列,但在表中需要它)。

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

+2

你是对的.. 2小时后..这是因为孩子表没有PK .. grr! – 2009-10-06 01:47:42

+0

对于Albert的第二个好答案,让我只是说我刚刚在SQL Server中做了一个在每个表中都包含时间戳字段的练习 - 这当然会让事情变得更简单。我从来没有在任何数据库引擎中没有PK的表,所以这不是我需要强制自己遵循的规则! – 2009-10-06 03:09:25

+0

不错的演绎+1 – 2009-10-06 07:54:32

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

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

+0

嗨,我不知道什么是实际执行。在表单上插入记录本身工作正常,但在表单是子表单时尝试插入记录会导致此错误。该子表单插入一个单一的文本值,没有功能,没有vba。 – 2009-10-05 23:49:29

+0

在我看来,你得到的消息意味着视图使用CAST函数来计算字段中的值,所以相应的字段不能被更新。如果问题是特定于子窗体,那么表单和子窗体之间的链接或子窗体记录集的主键可能建立在此计算值上。 – 2009-10-05 23:53:53

+0

我现在看看SQL Profiler实际发生了什么,谢谢你告诉我这件事,我不相信我之前甚至都不知道这件事。 – 2009-10-06 00:05:27

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

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

此问题的另一个原因是,如果您更改表名而不改变视图,那么该视图的“依赖关系”仍然会与表旧名称一起使用。

假设我有一个表'A'和一个'A'视图'A',并且我创建了一个名为'A'的新表,并将A的名称更改为'A_old',但是我没有执行ALTER VIEW,因此'Av'的依赖关系仍然保留在'A_old'上,但是视图是从'A'派生的,并且它试图以链接表的形式打开视图时隐藏了此Access中的错误

我刚刚花了一天的时间与Access ADP项目对抗,这个项目被导入到一个新的Access 2016 ACCDB文件中。起初,我认为这是应用程序代码的问题,但我直接将此密钥记录存入表中。有趣的是,记录总是被写入 - 这似乎是引发错误的回读。分析insert sql并从SQL Management Studio运行它没有任何问题。

导致问题的表具有GUID主键。切换到一个int列解决了问题。

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

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