5

看起来我不是唯一一个遇到这个问题的人,但这个问题似乎没有答案。

我在 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 有很大不同。

谢谢!

4

3 回答 3

6

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

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

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

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

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

于 2011-01-22T02:34:05.693 回答
0

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

于 2011-02-15T02:20:44.100 回答
0

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

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

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

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

于 2019-10-01T14:19:18.400 回答