2

由于 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(或其他)的字符串变量,并在下面的特定 SQL 之前执行以下代码

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

甚至查询也不一样:

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

2 回答 2

0

我不知道如何更改全局,但在说明中您可以使用:

INSERT INTO tblUser (
    UsrName,
    UsrEmail
)
SELECT
    :MyForm.dfUsrName,
    NULLIF(:MyForm.dfUsrEmail, '')
于 2015-01-13T08:03:38.610 回答
0

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

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

例子:

[oragtwy] substitute=@UPPER,UPPER

在示例中,当连接到 oracle DBMS 时,本机连接器正在考虑上面的设置,并且每次它发现一个内部包含“@UPPER”的语句(这是特定于 SqlBase)时,它用 UPPER 替换该字符串(这是在甲骨文中使用)

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

substitute='',

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

于 2017-01-03T13:05:41.117 回答