由于 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
如何更改全局,但在说明中,您可以使用:
INSERT INTO tblUser (
UsrName,
UsrEmail
)
SELECT
:MyForm.dfUsrName,
NULLIF(:MyForm.dfUsrEmail, '')
在 Sql 中.ini您可以使用substitute=
设置。此设置由 Gupta 为每个数据库客户端通信提供的本机连接驱动程序使用。
该设置必须放置在 sql.ini 中的相应部分中。即,当使用Oracle DBMS时,设置必须在[oragtwy]内部。该设置用于替换 DBMS 特定命令。
例:
[oragtwy]
substitute=@UPPER,UPPER
在上面提到的示例中,本机连接器在连接到oracle DBMS时会考虑该设置,并且每次发现内部包含"@UPPER"的语句(特定于SqlBase)时,它都会将该字符串替换为UPPER(在oracle中使用)
因此,在您的情况下,设置应如下所示:
substitute='',
在使用 oracle 数据库时,我经常使用它。