我必须将数据从用 Delphi/BDE (DBase IV) 编写的旧应用程序移动到使用 VisualStudio 2008/SQLServer 的新应用程序。我对 VS 还很陌生。为了从 Visual Studio 连接到数据库表,我使用 OLEDB JET 4.0,但在根据 boolean 值查询表时遇到问题。
假设我的表包含一个整数和一个 boolean 字段(或逻辑字段?)
1 true
2 NULL
3 false
SELECT * from mytable
将显示在 Visual Studio 的底部网格中
1 true
2 false
3 false
NULL 似乎默认为 false(BDE 过去也这样做),这对我来说没问题。我认为 boolean 字段的 NULL 值无论如何都没有意义。 但随后
SELECT * from mytable where field2 IS NOT NULL
显示相同的结果
SELECT * from mytable where field2 IS NULL
显示空结果集
最好的:
SELECT * from mytable where field2 = true
将显示在底部网格中
1 true
2 false
所以问题是: boolean 类型的 NULL 值默认为 true 吗? (网格只是通过将它们显示为“false”来表现错误?)还是默认为 false ?在这种情况下,我的 oledb dll 可能已过时或有错误(为什么不)?
最佳答案
我没有准确回答我自己的问题,但自从我提出这个问题以来,已经取得了一些进展。
我一直在尝试不同版本的 msjet40.dll 和 MSJETOLEDB40.dll。
在原来的帖子中,我使用了:
Windows 8.1 + Visual Studio 2008 SP1,
MSJETOLEDB40.dll 4.0.9756.0
MSJET40.dll 4.0.9765.0
(在你问之前,没有输入错误:它是 9765,而不是 MSJET40 的 9756,我已经检查了两次)。
结果是第一篇文章中描述的结果,即:NULL boolean 值似乎默认为 True,但网格显示 false 并且 IS NULL 看不到 NULL 值。然后我尝试了:
Windows XP SP3 + Visual Studio 2008(带或不带 SP1)。
MSJETOLEDB40.dll 4.0.9502.0
MSJET40.dll 4.0.9511.0
结果稍微好一些(无论如何更一致): boolean 值 NULL 默认为 true,并且网格确实显示“true”(而不是 Windows 8.1 设置中的 false)。但 IS NULL 仍然看不到 NULL 值。最终我尝试了:
Windows 7 SP1 + Visual Studio 2008(带或不带 SP1),
MSJETOLEDB40.dll 4.0.9756.0
MSJET40.dll 4.0.9756.0
啊...很好(终于!): boolean 值 NULL 默认为 false,并且 Grid 确实显示“false”。至于 IS NULL,仍然看不到 NULL 值,但考虑到它默认为 false,我不再介意了。
为了回答 Oleg 问题,我所做的 5 次测试中的连接字符串是相同的:
Provider=Microsoft.Jet.OLEDB.4.0;数据源=C:\Cartociel\Decamps;Persist Security Info=False;扩展属性=“dBase IV”
目前,除非有人有更好的主意,否则我怀疑 MSJET40 4.0.9765 是罪魁祸首,我将看看该 dll 的旧版本是否可以在我的 Windows 8.1 设置上运行。
抱歉这么长的帖子(仍在努力中)...
关于sql - boolean 类型的 OLEDB JET 和 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19792253/