5

I'm adding a parameter to be called with a MySQL stored procedure like

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

But for some reason when I look at MyParams, MyId value when stepping through my code, it is converted to null. Does anyone know why this is because if I assign the value from a int variable like below it is fine

int id = 0;
List<MySqlParameter> MyParams = new List<MySqlParameter>(); 
MyParams.Add(new MySqlParameter("MyId", id));
H H
  • 263,252
  • 30
  • 330
  • 514
neildt
  • 5,101
  • 10
  • 56
  • 107

3 Answers3

9

Well, You fell into the corner case of c# that literal 0 can be converted to Enum implicitly

An implicit enumeration conversion permits the decimal-integer-literal 0 to be converted to any enum-type

Reference

So, new MySqlParameter("MyId", 0) is compiled into MySqlParameter(string,MySqlDbType) rather than MySqlParameter(string,object) as the result your value 0 is ignored.

new MySqlParameter("MyId", id) this works because implicit conversions to enum works only when the value is literal not for variables. So It is clear that this gets compiled into MySqlParameter(string,object) resulting the expected results.

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

or this

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

BTW as @Suraj Singh pointed you may have to use @MyId instead of MyId.

Hope this helps

Sriram Sakthivel
  • 72,067
  • 7
  • 111
  • 189
2

Use caution when you use this overload of the SqlParameter constructor to specify integer parameter values. Because this overload takes a value of type Object, you must convert the integral value to an Object type when the value is zero ---MSDN Hope it's applicable for MySql too.

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

or try

Parameters.AddWithValue("@MyId", 0);
Suraj Singh
  • 4,041
  • 1
  • 21
  • 36
0

In your database schema, Is MyId a Primary Key of type int? with allow null set to yes?

assigning a value of 0 to a PK with allow null, will result in NULL being assigned. I suspect its the database setup and not the code at fault.

FlemGrem
  • 814
  • 4
  • 9