为什么MySqlParameter将参数添加为0转换为null

时间:2013-09-13 13:48:59

标签: c# mysql null mysql-parameter

我正在添加一个要用MySQL存储过程调用的参数,比如

List<MySqlParameter> MyParams = new List<MySqlParameter>();    
MyParams.Add(new MySqlParameter("MyId", 0));

但出于某些原因,当我查看MyParams时,MyId值在单步执行代码时会被转换为null。有没有人知道为什么这是因为如果我从如下的int变量中分配值,那就没问题了

int id = 0;
List<MySqlParameter> MyParams = new List<MySqlParameter>(); 
MyParams.Add(new MySqlParameter("MyId", id));

3 个答案:

答案 0 :(得分:7)

嗯,你陷入c#的角落,文字0可以隐式转换为Enum

  

隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型

Reference

因此,new MySqlParameter("MyId", 0)被编译为MySqlParameter(string,MySqlDbType)而不是MySqlParameter(string,object),因此您的值0将被忽略。

new MySqlParameter("MyId", id)这是有效的,因为只有在literal值不是variables的情况下,对枚举的隐式转换才有效。很明显,这会被编译成MySqlParameter(string,object),从而产生预期的结果。

new MySqlParameter("MyId", (object)0)//this solves the problem

或者

New MySqlParameter("MyId", MySqlDbType.Int).Value = 0

BTW as @Suraj Singh指出,你可能不得不使用@MyId代替MyId

希望这有帮助

答案 1 :(得分:2)

使用SqlParameter构造函数的此重载指定整数参数值时请小心。因为此重载采用Object类型的值,所以当值为零时,必须将整数值转换为Object类型--- MSDN 希望它也适用于MySql

MyParams.Add(New MySqlParameter("@MyId", MySqlDbType.int)).Value = 0;

或尝试

Parameters.AddWithValue("@MyId", 0);

答案 2 :(得分:0)

在数据库架构中,MyId是否为int类型的主键?将allow null设置为yes?

将值0赋值给带有allow null的PK,将导致分配NULL。 我怀疑它的数据库设置而不是错误的代码。

相关问题