【问题标题】:Nullable bool fields in MS Access linked tablesMS Access 链接表中的可空布尔字段
【发布时间】:2011-06-13 11:09:59
【问题描述】:

看起来我不是唯一遇到此问题的人,但似乎没有解决此问题的方法。

我在 Access 2010 中工作,使用指向 SQL Server 2005 数据库的链接表(通过 SQL Server ODBC 管道)。在该表中,其中一个布尔字段被标记为可为空,并且该表中的几条记录实际上在该字段中具有空值。到目前为止一切顺利。

Access 出现了,一旦打开链接表,Access 就会显示 0(假)而不是空白单元格(问题 #1)。如果您尝试修改记录中的任何内容,您会收到一条错误消息,指出该记录已被其他人修改,您的更改无法保存。最后一个问题是由于 Access 不容忍可为空的 bool 字段,并且在尝试保存值时有点疯狂。

我的研究表明,这可能与 Access 在后台使用 Jet 连接到 SQL Server 数据库有关,而 Jet 显然不支持可为空的布尔值。似乎没有办法配置 Jet 来支持这一点(尽管可能有,如果你在代码中连接)。我还认为 MS 正在用 Office 2010 中使用的另一种技术(我认为是 ACE)取代 Jet,但无法判断这是否是 Access 实际使用的技术。无论哪种情况,我都找不到关于可空布尔值的可配置选项。

最后,这个问题似乎不久前已经被提出到MS,但他们没有答案:https://connect.microsoft.com/SQLServer/feedback/details/617339/null-bit-fields-produce-spurious-ms-access-errors-when-using-the-native-odbc-driver?wa=wsignin1.0#tabs

我想知道是否还有其他人遇到过这个问题并找到了解决方案。在您提出建议之前,关闭可空选项并将所有空值设置为“假”在我们的案例中并不是一个真正的选项。对我们来说,null 实际上是一个有效的状态,与 'false 有很大的不同。

谢谢!

【问题讨论】:

标签: sql-server ms-access nullable ms-jet-ace


【解决方案1】:

ACE 是 Jet 的升级版(从 Jet 4.0 代码库派生出来,由 Windows 团队维护,没有看到任何进一步的开发,而 ACE 正在由 Access 团队全面开发)。它与 Jet 没有显着不同,只是它是数据库引擎的新版本,并且具有 Jet 所缺乏的功能。

可空布尔值不是新增功能之一。在任何情况下,如果我没记错的话,关于布尔值是否应该为 Nullable 以及 Jet/ACE 是否应该为 Nullable 存在很大的理论争论。

即使在 Access/Jet/ACE (Allen Browne has discussed one such, with LEFT JOINs) 中,不可为空的布尔值也会导致问题。我的建议是将该字段更改为 Nullable Bit、Byte 或 Integer 字段(我不确定 SQL Server 中的确切数据类型,也不确定与 Access/Jet/ACE 最兼容的数据类型)。

或者,您可以通过使用 CAST() 视图将服务器端布尔值转换为 INT 来处理 BIGINT 问题。这使其不可编辑,但(与 BIGINT 一样),您可以将原始字段保留在 VIEW 中并使用适当的值写入该字段,而 CAST() 版本仅用于显示。

对于它的价值,用于 Access 的 SSMA 将 Jet/ACE 布尔值提升为可为空的位字段(但不确定它们为什么可以为空 - 我可能需要检查我的一些应用程序以确保它们正常工作!) .

【讨论】:

  • 我认为 Nullable Bit 很好。
  • 您好,很抱歉回复晚了。我检查了我们的 SQL 数据库,它已经是一个可以为空的位。没有其他字段类型允许将布尔类型数据存储在其中,除非我选择一个可为空的 int 并对其施加 0/1 的约束。这是一种选择,但会在其他地方产生影响。不是我的第一选择。
  • 关于 SSMA 将布尔值升迁为可空位的评论 - 你能详细说明一下吗?您是指在连接到 thios 表时,其中包含 bool 字段的 Access 表被解释为可空位吗?我正朝着不同的方向前进 - 我的表在 SQL Server 中,我正在使用 Access 连接到它...
  • 当您使用 SSMA 升迁带有布尔字段的 Acesss 表时,它会在 SQL Server 中创建为可空位字段。实际上,要 100% 正确映射,它应该是一个不可为空的位字段,因为 Jet/ACE 布尔字段不可为空,所以它不是 1:1 转换。但我通过引用这一点来表达的观点是,MS 认为它是升迁时最接近的匹配,因此应该是 Access 前端与 SQL Server 最兼容的数据类型。
【解决方案2】:

按照此 Microsoft KB http://support.microsoft.com/kb/318882 中的分析 这是我们为解决这个问题所做的。 1)我们运行了一个 sql 脚本来更新该表中位字段中包含空值的行,2)然后我们修改表定义以在这些位字段中包含默认值“0”。

【讨论】:

  • 这是一篇有趣的文章。我升级的最后一个数据库(使用 SQL Server Express 2008 R2 运行 A2003)没有遇到此类问题,并且我没有为布尔字段提供默认值。我需要检查一下,但如果出现了引用的问题,我会在过去 6 个月内收到重大错误报告(我没有),所以看起来肯定有其他事情发生.也许 SQL 2005 和 2008 之间发生了一些变化。我想知道您的表是否都有 PK 和时间戳字段?
【解决方案3】:

我在我的项目中遇到了同样的问题,我在 2000 年初的旧订购系统中实现了一些附加组件,并且布尔值被广泛使用。

今天我通过使用直通查询找到了一个解决方案,如下所示:

SELECT 
    *,  
    CASE MYFIELD 
       WHEN NULL THEN NULL 
       WHEN 1 THEN 1 
       WHEN 0 THEN 0 
    END AS MYRESULT
FROM 
    DBO.MYTABLE

这是不可更新的,但无论如何常规 SQL 语句都在那里工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多