我正在添加一个要用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));
答案 0 :(得分:7)
嗯,你陷入c#的角落,文字0
可以隐式转换为Enum
隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型
因此,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。 我怀疑它的数据库设置而不是错误的代码。