sql - boolean 类型的 OLEDB JET 和 NULL 值

标签 sql null boolean oledb dbase

我必须将数据从用 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 和 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 boolean 值似乎默认为 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

结果稍微好一些(无论如何更一致): boolean 值 NULL 默认为 true,并且网格确实显示“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

啊...很好(终于!): 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/

相关文章:

php - 通过 PHP GET 传递 boolean 值

mysql - 添加 3 列并获取该相加的 MAX 值

c - 检查数组值是否为 NULL,即是否已设置

flutter - 在空 flutter 上调用getter 'text'

c# - 在c#中检查flowLayoutPanel是否为空

c - 为什么与 bool 的比较在 C11 中不转换为 bool?

c# - sql语法错误-无法将字符串追加到数据库

mysql - 如何在mysql表中进行逐行计算以获得汇总结果?

java - 如何在sql中转义 "'”

mySQL 使用枚举而不是两个 boolean 字段有优势吗?