Dav*_*iel 5 sql-server ms-access nullable ms-jet-ace
看起来我不是唯一一个有这个问题的人,但似乎没有对这个问题感到满意.
我在Access 2010中工作,使用链接表到SQL Server 2005数据库(通过SQL Server ODBC管道).在该表中,其中一个布尔字段被标记为可为空,并且该表中的多个记录实际上在该字段中具有空值.到现在为止还挺好.
在Access中,只要打开链接表,Access就会显示0(假)而不是空白单元格(问题#1).如果您尝试修改记录中的任何内容,则会收到一条错误消息,指出该记录已被其他人修改,并且您的更改无法保存.最后一个问题是由于Access不能容忍可以为空的bool字段,并且在尝试保存值时有点疯狂.
我的研究表明,这可能与Access在后台使用Jet连接到SQL Server数据库有关,而Jet显然不支持可空的bool.似乎没有办法配置Jet来支持这一点(尽管如果你在代码中连接,可能会有).我还认为MS正在用Office 2010中使用的另一种技术取代Jet(ACE,我认为),但无法判断这是否是Access实际使用的内容.在任何一种情况下,我都找不到关于可空bool的可配置选项.
最后,这个问题似乎很久以前就已经提到了MS,但是他们的结局没有答案:https://connect.microsoft.com/SQLServer/feedback/details/617339/null-bit-fields-produce -spurious-MS-访问错误-当-用最原生的ODBC驱动程序?WA = wsignin1.0#标签
我想知道是否有其他人遇到这个并找到了解决方案.在你建议它之前,关闭可空选项并将所有空值设置为'false'在我们的例子中并不是一个真正的选择.对我们来说,null实际上是一个有效状态,与'false'非常不同.
谢谢!
ACE是Jet的升级版(源自Jet 4.0代码库,由Windows团队维护,没有看到任何进一步的开发,而ACE正由Access团队完全开发).它与Jet没有太大的不同,除了它是数据库引擎的新版本并且具有Jet缺乏的功能.
可空的布尔值不是增加的功能之一.在任何情况下,如果我没有弄错的话,关于布尔人是否应该是Nullable并且Jet/ACE在他们不应该这样做的方面有很大的理论争论.
即使在Access/Jet/ACE中,不可空的布尔也会引起问题(Allen Browne已经讨论过这种问题,使用LEFT JOIN).我的建议是你将字段更改为Nullable Bit,Byte或Integer字段(我不确定SQL Server中的确切数据类型是什么,以及与Access/Jet/ACE最兼容的是什么).
或者,您可以通过使用CAST()服务器端布尔值到INT的视图来处理BIGINT问题.这使得它不可编辑但是(与BIGINT一样),您可以将原始字段保留在VIEW中并使用适当的值写入,而CAST()版本仅用于显示.
对于它的价值,SSMA for Access将Jet/ACE布尔值增加到可以为空的位字段(不知道为什么它们可以为Nullable - 我可能需要检查一些我的应用程序以确保它们正常工作!).