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

C# 为什么MySqlParameter将参数添加为0转换为null,c#,mysql,null,mysql-parameter,C#,Mysql,Null,Mysql Parameter,我添加了一个参数,用MySQL存储过程调用,比如 List<MySqlParameter> MyParams = new List<MySqlParameter>(); MyParams.Add(new MySqlParameter("MyId", 0)); List MyParams=new List(); 添加(新的MySqlParameter(“MyId”,0)); 但由于某种原因,当我查看MyParams时,在遍历代码时,MyId值被转换为null。有

我添加了一个参数,用MySQL存储过程调用,比如

List<MySqlParameter> MyParams = new List<MySqlParameter>();    
MyParams.Add(new MySqlParameter("MyId", 0));
List MyParams=new List();
添加(新的MySqlParameter(“MyId”,0));
但由于某种原因,当我查看MyParams时,在遍历代码时,MyId值被转换为null。有人知道为什么会这样吗?因为如果我从下面这样的int变量赋值就可以了

int id = 0;
List<MySqlParameter> MyParams = new List<MySqlParameter>(); 
MyParams.Add(new MySqlParameter("MyId", id));
intid=0;
List MyParams=new List();
添加(新的MySqlParameter(“MyId”,id));

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

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

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

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

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

好吧,您陷入了c的困境,即literal
0
可以隐式转换为
Enum

隐式枚举转换允许将十进制整数文本0转换为任何枚举类型

因此,
newmysqlparameter(“MyId”,0)
被编译成
MySqlParameter(string,MySqlDbType)
,而不是
MySqlParameter(string,object)
,因此您的值
0
被忽略

newmysqlparameter(“MyId”,id)
这是因为只有当值为
literal
时,对枚举的隐式转换才有效,而不是
变量的隐式转换。因此很明显,这会被编译成
MySqlParameter(string,object)
,从而得到预期的结果

new MySqlParameter("MyId", (object)0)//this solves the problem
还是这个

New MySqlParameter("MyId", MySqlDbType.Int).Value = 0
顺便说一句,正如@Suraj Singh所指出的,您可能必须使用
@MyId
而不是
MyId


希望这有帮助

MyId是INT类型PrimaryKey的一部分。在表架构中,列被设置为NOT null,但
0
不是
null
^agree。为什么要将0作为主键插入?当您插入“1”时会发生什么?@AaronHopkins MyId是PrimaryKey的一部分,而不是单列PrimaryKey您的数据库和规则。不用担心。发布
MySqlParameter
的代码,没有它,这个问题是无法回答的。MySqlParameter是MySql.Net API的一部分:好的,那是我的*东西。我们仍然需要查看MyParams是如何被推送到命令中的。@downvoter您能给我一个下推投票的原因吗?