在 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 似乎不支持 OUTPUTRETURNING,就像 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 字段?

使用 C# 将 DateTime 格式转换为 SQL 格式

如何在函数的 UPDATE 或 SELECT 语句中使用动态列名?

如何在 SQLite 表中插入日期和查询日期

SQL:with 查询