SQLWindows中的本机连接,有没有办法在没有额外变量的情况下在SQL中发送NULL而不是空格?

时间:2015-01-12 13:34:00

标签: odbc guptateamdeveloper centura

由于ODBC驱动程序造成许多不便,无论数据库管理系统(在我的情况下是SQL Server 2000),我都想将我的应用程序连接类型从ODBC更改为本机。

SQLWindows提供此功能,但存在巨大差距。使用ODBC驱动程序,当表单中的字段为空时,它将发送NULL以记录在数据库中。感谢 sql.ini 文件中的配置参数 setzerolengthstringstonull = on 。但是,使用本机连接时,它会发送一个空白字符串'',当然,这会导致各种不一致和错误,具体取决于列所关联的表或外键。我不知道如何在 UDL文件中重现参数 setzerolengthstringstonull 或在内部进行更改。

有没有办法在应用程序中正确配置,甚至在运行之前拦截SQL命令(以通用方式,而不是在每个SQL之前),所以我可以手动将空值更改为NULL?

我知道SQLWindows文档建议我不要直接在SQL中发送字段,而是创建额外的变量,检查这些字段是否为空,将变量设置为字段中的值或 STRING_Null ,并在SQL中发送变量。由于我的应用程序的庞大规模,在我的情况下这是不可能的。这需要简单地重写几乎所有内容。


我写了两个关于它们之间的不同之处的最小例子:

这适用于OBDC,它在表 tblUser 中插入用户,假设列 UsrEmail tblEmail 中查找电子邮件。 dfUsr [something] MyForm 中的控件。

INSERT INTO tblUser (
    UsrName,
    UsrEmail
)
SELECT
    :MyForm.dfUsrName,
    :MyForm.dfUsrEmail

要在本机连接中执行相同操作,我必须创建一个名为 sUsrEmail (或其他)的String变量,并在下面的特定SQL之前执行以下代码

if SalIsNull(MyForm.dfUsrEmail)
    sUsrEmail = STRING_Null
else
    sUsrEmail = MyForm.dfUsrEmail

即使查询也不同:

INSERT INTO tblUser (
    UsrName,
    UsrEmail
)
SELECT
    :MyForm.dfUsrName,
    :sUsrEmail

2 个答案:

答案 0 :(得分:0)

我不知道如何改变全局, 但在教学中你可以使用:

INSERT INTO tblUser (
    UsrName,
    UsrEmail
)
SELECT
    :MyForm.dfUsrName,
    NULLIF(:MyForm.dfUsrEmail, '')

答案 1 :(得分:0)

在Sql.ini中,您可以使用substitute=设置。 Gupta为每个DB-Client通信提供的本机连接驱动程序使用此设置。

该设置必须放在sql.ini的相应部分中。 即使用Oracle DBMS时,设置必须在[oragtwy]内 已设置用于替换DBMS特定命令。

示例:

[oragtwy] substitute=@UPPER,UPPER

在上面提到的示例中,当连接到oracle DBMS时,本机连接器正在考虑该设置,并且每次发现内部具有“@UPPER”的Statement(特定于SqlBase)时,它将该字符串替换为UPPER (在oracle中使用)

因此,在您的情况下,设置应如下所示:

substitute='',

我在使用oracle数据库时经常使用它。