我今天遇到了惊喜,我们正在开发一个连接到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的默认值。