来自mysqlconnector.net

时间:2015-09-30 16:15:18

标签: c# mysql stored-procedures mysql-connector

我今天遇到了惊喜,我们正在开发一个连接到mysql数据库的C#应用​​程序。直到今天我们将一些东西从一台服务器迁移到另一台服务器时,一切正常。现在,数据库中缺少一些数据,并且存储过程因此而返回null值。不幸的是,我们得到的整数值为0,而不是整数值。

为简单起见,我们可以说我的MySql Server中有以下存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_config_code`(
IN order_n BIGINT,
IN order_position_n INT,
OUT out_config_code BIGINT)
BEGIN
    set out_config_code = null;
END

然后我通过创建一个MySqlCommand实例向MySqlConnector .net添加参数来调用存储过程。然后以非常简单的方式调用存储过程,如下所示:

mReader = mCommand.ExecuteReader();
if ((mReader != null) && (mReader .HasRows))
{
    mReader .Close();
}

然后我尝试检查参数是否为Null,如下所示:

if (mCommand.Parameters[param_id].Value != System.DBNull.Value)

遗憾的是,尽管存储过程显式地将输出参数设置为null,但该参数为非null,且其类型为Int64且值为0(通过调试器检查)

如果数据实际存在,代码可以正常工作,并且我得到正确的整数值。我最好的猜测是在c#中有一个空的“整数值”并不是很容易,因为它是一个不可为空的类型...但是我希望参数的类型是System.DBNull,即使是非可空的类型(它适用于字符串)

我错过了什么?

提前感谢您提供任何帮助

更新:嗯......我们对系统的测试进行了一些考古...事实证明,以前从未测试过存储过程的空整数返回,这就解释了为什么问题没有提前出现。我们在迁移之前在服务器上执行了存储过程,在DB中使用了相同的数据,并且还存在“问题”。

我的理解是当输出参数值为null时,非可空数据类型将作为其默认值返回;当输出参数为null时,可以为null的数据类型返回预期的System.DBNull.Value。

我觉得有趣的是,在int的情况下,通过调用ExecuteReader返回的阅读器包含与输出参数的值匹配的数据;在检查读者时,我们找到了预期的空值,而不是int的默认值。

0 个答案:

没有答案