1

我维护了一个使用 ESQL 风格(Informix API)调用编写的第 3 方 Informix 驱动程序。我正在处理一个错误,在该错误中,对于 TEXT 字段,INSERT 工作正常而 UPDATE 失败。单步执行代码,我发现我们正在检查我们的 sqlda 结构以告诉我们是否以及如何绑定,并且在调用 sqli_describe_statement 之后,sqlda.sqld 变量包含 2,即绑定参数的正确数量这个插入调用,并且参数似乎设置正确,而在更新情况下,返回的数字是 0,没有参数信息(它应该是 1,对于一个参数:“UPDATE TESTTAB SET COLNAME = ? WHERE OTHERCOLNAME = 1")。

使用 sqlda 信息,我们为 INSERT 正确设置了所需的定位器结构,但我们无法进行更新,因为信息不存在。如果我在调试器中伪造它并运行设置定位器代码进行更新,它会更新得很好。

该语句当然看起来是正确的,并且在 INSERT 中使用了与 UPDATE 绑定相同的变量。此外 sqli_prep 更新没有问题。对于 describe,sqsla.code 返回不同的非负数 4 和 6,表示被描述的不同类型的语句,作为文档化(即,不是错误代码),因此没有明显的问题。

  1. 还有什么我应该在此之前检查代码的东西,这可能会导致这种奇怪的行为(除了对不同查询的特殊情况处理——那里什么都没有)

  2. 我是否在这里遗漏了一些关于如何在 TEXT 字段上进行更新的基本知识,例如您必须创建一个定位器对象,找到该行,然后一起单击三下并说“没有像 IBM 这样的地方?”

到目前为止,Google Fu 在文档中几乎没有出现,但是如果您知道指明方向的文档或示例,那也很酷。

4

1 回答 1

1

这是 Informix 行为的模糊领域之一。DESCRIBE 的行为应该描述输出参数(它是 DESCRIBE OUTPUT stmt INTO ...的简写);要描述输入参数,您可以使用 DESCRIBE INPUT stmt INTO ... 代替。

然而,由于各种原因可以追溯到时间的黎明(好吧,无论如何,是 1985 年),INSERT 语句获得了特殊情况豁免,并且简单的 DESCRIBE 描述了它的输入参数 - 不像 UPDATE 或 DELETE(或者,这些天,MERGE)。

因此,您的代码可能是在 DESCRIBE INPUT 和 DESCRIBE OUTPUT 变得可行之前编写的(大约是 2000±3 年)。原则上,使用定向 DESCRIBE 语句应该可以解决问题。可能需要设置一个 ONCONFIG 参数来获取此行为。

我记得很感激这个功能的到来,但我还记得我当时在想“该死的,我暂时无法使用它——直到没有它的旧版本全部退役”。我认为现在基本上已经发生了——尤其是 IDS 7.31 现在已经过时,IDS 9.x 版本也确实如此,所以所有可用的 IDS 版本都支持该功能。OnLine 5.20 - 少数股权 - 仍然不支持,也永远不会支持它。因此,我需要查看如何更新我的程序(例如SQLCMD)来利用它。那里的代码包括我所说的“小插曲”;它们是完整的小程序,说明如何使用 BYTE 和 TEXT blob。例如,您可能会发现 UPDBLOB 或 APPBLOB 有一些用处。

于 2010-07-10T02:25:50.690 回答