5

我正在添加一个要使用 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));
4

3 回答 3

9

好吧,您陷入了可以将文字隐式0转换为c# 的极端情况Enum

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

参考

所以,new MySqlParameter("MyId", 0)被编译成MySqlParameter(string,MySqlDbType)而不是MySqlParameter(string,object)作为结果你的值0被忽略。

new MySqlParameter("MyId", id)这是有效的,因为仅当值literal不是 for时,隐式转换为 enum 才有效variables。所以很明显,这被编译成MySqlParameter(string,object)预期的结果。

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

或这个

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

顺便说一句,@Suraj Singh 指出您可能必须使用@MyId而不是MyId.

希望这可以帮助

于 2013-09-13T15:23:36.470 回答
2

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

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

或尝试

Parameters.AddWithValue("@MyId", 0);
于 2013-09-13T14:15:48.583 回答
0

在您的数据库架构中,MyId 是 int 类型的主键吗?将允许 null 设置为是?

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

于 2013-09-13T13:53:39.420 回答