2

我必须将数据从用 Delphi/BDE (DBase IV) 编写的旧应用程序移动到使用 VisualStudio 2008/SQLServer 的新应用程序。我对VS相当陌生。要从 Visual Studio 连接到 dbase 表,我使用 OLEDB JET 4.0,但在针对布尔值查询我的表时遇到了麻烦。

假设我的表包含一个整数和一个布尔字段(或逻辑字段?)

1 true
2 NULL
3 false

SELECT * from mytable将显示在visual studio的底部网格中

1 true
2 false
3 false

NULL 似乎默认为 false(BDE 过去也这样做),这对我来说很好。我认为布尔字段的 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

所以问题是:布尔类型的 NULL 值是否默认为 true ?(并且网格只是通过将它们显示为“false”而行为不端?)还是默认为 false ?在这种情况下,我的 oledb dll 可能已经过时或有问题(为什么不)?

4

1 回答 1

2

我并没有特别回答我自己的问题,但自从我提出这个问题以来已经取得了一些进展。
我一直在尝试不同版本的 msjet40.dll 和 MSJETOLEDB4​​0.dll。
在原始帖子中,我使用了:

Windows 8.1 + Visual Studio 2008 SP1,
MSJETOLEDB4​​0.dll 4.0.9756.0
MSJET40.dll 4.0.9765.0

(在你问之前,没有打字错误:它是 9765,而不是 MSJET40 的 9756,我检查了两次)。
结果是第一篇文章中描述的结果,即:NULL 布尔值似乎默认为 True,但网格显示为 false,IS NULL 看不到 NULL 值。然后我尝试了:

Windows XP SP3 + Visual Studio 2008(带和不带 SP1)。
MSJETOLEDB4​​0.dll 4.0.9502.0
MSJET40.dll 4.0.9511.0

结果稍微好一些(无论如何更一致):布尔 NULL 默认为 true,并且 Grid 确实显示“true”(而不是在 windows 8.1 设置中为 false)。但是 IS NULL 仍然看不到 NULL 值。最终我尝试了:

Windows 7 SP1 + Visual Studio 2008(带和不带 SP1),
MSJETOLEDB4​​0.dll 4.0.9756.0
MSJET40.dll 4.0.9756.0

啊...很好(终于!):布尔 NULL 默认为 false,Grid 确实显示“false”。至于 IS NULL,仍然看不到 NULL 值,但考虑到它默认为 false,我不再介意。

为了回答 Oleg 的问题,我所做的 5 个测试中的连接字符串是相同的:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Cartociel\Descamps;Persist Security Info=False;Extended Properties="dBase IV"
目前,除非有人有更好的主意,否则我怀疑 MSJET40 4.0.9765 是罪魁祸首,我会看看那个 dll 的旧版本是否可以在我的 Windows 8.1 设置上运行。

很抱歉那个长帖子(并且仍在努力)......

于 2013-11-07T11:07:02.437 回答