在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数
Posted
技术标签:
【中文标题】在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数【英文标题】:Informix 11.7 returns -1 as number of affected rows when using DateTime or string parameter in UPDATE query 【发布时间】:2015-12-10 14:39:01 【问题描述】:为什么 Informix 11.7 会返回 -1 作为受影响的行数,而 Informix 11.5 会返回 0?它不会导致错误或异常,它只是返回 -1。
我们使用 IBM Data Server Client 10.5。在跟踪驱动程序时,我看到 11.5 会返回 DB2Command.ExecuteNonQuery api exit1, rc = 0 - 0
,而 11.7 会返回 DB2Command.ExecuteNonQuery api exit1, rc = 0 - -1
可使用此代码重现:
DbProviderFactory factory = DbProviderFactories.GetFactory("IBM.Data.DB2");
IDbConnection connection = factory.CreateConnection();
connection.ConnectionString = "Database=xxx;Server=xx.xx.xx.net:9099;UserID=xxx;Password=xxx";
connection.Open();
using (var command = connection.CreateCommand())
command.CommandText = "UPDATE demotable SET value = 1 WHERE dateutc = ?";
var dateTimeParameter = command.CreateParameter();
dateTimeParameter.Value = DateTime.UtcNow;
command.Parameters.Add(dateTimeParameter);
var affectedRows = command.ExecuteNonQuery(); // Returns -1, but expected 0
更新:
使用命令select dbinfo('sqlca.sqlerrd2') from systables where tabid = 1
运行ExecuteScalar
会返回预期的行数。
它发生在所有表上,没有触发器。
使用 INT 作为参数时效果很好,使用字符串也会失败。
当更新影响行时,按预期返回 1。
不同数据库 (Informix 11.5) 上的相同表返回预期的行数。
有问题的数据库被复制到其他服务器(RW 实例)。
【问题讨论】:
如果您使用select
语句,这是正常行为,因为对于select
语句,ExecuteNonQuery
的返回值是-1
,但由于您的问题出在Update
,因此您应该有如果您确定 dateTimeParameter
包含值并且没有其他任何东西阻止值被更新,那么没问题。看看这个答案:***.com/a/32736842/2946329
【参考方案1】:
我不确定为什么返回值不同,我从未使用过 .NET 中的 Informix,但是,在 Informix 中获取受影响行数的“正确”方法是在之后选择 DBINFO('sqlca.sqlerrd2')
更新语句,不检查返回值。
查看in the documentation
【讨论】:
有效点。那么我的问题是这种行为在 11.5 和 11.7 之间是否发生了变化? 是的,我无法回答,我不知道。UPDATE
的 documentation 根本没有提到任何返回值。此外,Informix 似乎不支持 OUTPUT
或 RETURNING
,就像 T-SQL 或 Oracle 那样......但我对 Informix 的了解还很远,所以我真的不知道。
那么driver documentation 可能有问题。它声明:“对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。对于所有其他类型的语句,返回值为 -1。”
@Luuk 看起来像这样。如果文档是针对您正在使用的驱动程序版本的,那么它看起来像是驱动程序中的一个错误,因为它确实很清楚地说明了它。只是为了排除其他错误,不使用参数或者使用DateTime
以外的其他类型是否返回0?
对不起,我错了,(我在执行ExecuteScalar
时使用了ExecuteNonQuery
而不是DBINFO
。该方法返回正确的更新行数,所以我再次猜测驱动程序不会' t 返回正确的更新行数。如果我能找到哪里,我将在 IBM 提出问题:)以上是关于在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数的主要内容,如果未能解决你的问题,请参考以下文章
PHP UPDATE MSDB datetime memo 请帮我不要发疯
忽略 MySqlDataAdapter.Update(DataTable) 中的 DATETIME 字段?