我维护了第三方Informix驱动程序,该驱动程序是使用ESQL样式(Informix API)调用编写的。我正在研究一个错误,对于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,表示所描述的不同类型的语句,如文档所述(即,不是错误代码),因此没有明显的问题。
我之前是否应该检查代码中的其他内容,这可能会导致这种奇怪的行为(除了针对不同查询的特殊情况处理 - 没有任何问题)
我在这里遗漏了一些关于如何在TEXT字段上执行UPDATE的基本内容,例如你必须创建一个定位器对象,找到行,然后一起点击三次并说“没有像IBM这样的地方?”
到目前为止,Google Fu在文档中的表现很少,但如果你知道文档或样本指明了方向,那也很酷。
答案 0 :(得分: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。