gpt4 book ai didi

delphi - Sybase 12.5-BDE-ADO "where myColumn=null"故障

转载 作者:行者123 更新时间:2023-12-03 15:55:09 25 4
gpt4 key购买 nike

我们有一个旧的应用程序,它读取 SQL 文本文件并将其发送到 Sybase ASE 12.51。我们的旧应用程序是用 Delphi 5 编写的,并使用 BDE TQuery 组件来执行此过程,并使用 BDE SQLinks for Sybase 访问 Sybase。

伪代码:

SQLText=readSQLFile;
aTQuery.SQL.add(SQLText);
aTQuery.ExecSQL;

最近,我们将数据库访问层移至 Delphi XE ADO 实现 - TADOQuery,使用 Sybase 提供的 ADO 提供程序,仍然使用相同的模型:

SQLText=readSQLFile;
aTADOQuery.SQL.add(SQLText)
aTADOQuery.ExecSQL;

迁移到 ADO 后,我们发现某些数据丢失。我们将失败追溯到此 SQL 构造:

Select myColumn from myTable 
Where tranID = null

知道这个构造充其量在语义上是有问题的,所以当我看到这段代码时,我做了“双重考虑”,但 Sybase 12.5 接受它 - 但是使用 ADO,这个段失败了。

我们决定改变:

Where  tranID = null

Where  tranID is null

然后加载丢失的数据 - 问题得到解决,对于该段和其他几个段也是如此。

有人对这种行为有解释吗? ADO 显然在哪里/为什么拦截并拒绝了该序列,而 BDE 却通过了它?

TIA

最佳答案

“NULL”有非常特殊的含义,SQL需要特殊处理。您不能将值与“NULL”进行比较,这就是为什么有特殊运算符 IS (NOT) NULL 来检查它。详尽的解释会占用一些空间,这里是一个简单的解释。

从“数学”的角度来看,NULL可以被认为是“无穷大”。您无法轻松比较两个无限值,例如考虑整数和偶数的集合。两者都是无限的,但从逻辑上看,前者比后者大。你只能说这两个集合都是无限的。

这也有助于解释为什么 1 + NULL 返回 NULL 等(通常只有像 SUM() ecc 这样的聚合函数可能会忽略 NULL 值 - 忽略,而不是将 NULL 变成零)。

这个比喻在排序中可能不成立,因为某些数据库选择将 NULL 视为小于任何值(某种 -无穷大,从而按升序首先返回它们),反之亦然。有些可以选择设置返回 NULL 的位置。

检查有关 NULL 算术和 NULL 比较的数据库文档。 field = NULL 应该从来没有被使用过,不知道 Sybase 是否接受它,但大多数 SQL 实现不接受,我猜它不符合 SQL 标准。最好习惯 IS (NOT) NULL 语法。

更新:Sybase 有一个“set ansinull”选项,来自 documentation (始终为 RTFM!),在 12.5.1 中,它被扩展为不允许使用 '= NULL' 语法(当设置为 ON 时以使其符合 SQL 标准)。当设置为 OFF 时,“= NULL”相当于“IS NULL”。

也许 SQL 链接或 ADO 提供程序将其设置为一个值或另一个值。

关于delphi - Sybase 12.5-BDE-ADO "where myColumn=null"故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8476890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com