Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dapper How to Handle DBNull by DynamicParameter.Get

var param = new DynamicParameters();
param.Add("MsgId", DbType.Int32, direction: ParameterDirection.Output);

connection.Execute(MessageSelOutMessageId, param, commandType: CommandType.StoredProcedure);
count = param.Get<int>("MsgId");

By referencing Dapper, I used the code above to call a Stored Procedure with an output parameter - MsgId. It is working fine, but in some cases, there would be no value returned from the Stored Procedure and the returned output parameter value would be null. In these cases, I got this exception :

Attempting to cast a DBNull to a non nullable type! Note that out/return parameters will not have updated values until the data stream completes (after the 'foreach' for Query(..., buffered: false), or after the GridReader has been disposed for QueryMultiple)

I'd understood that we could mark the return Data Type as nullable to avoid this error by using the code below

count = param.Get<int?>("MsgId");

But, is there any other way to check param.Get("MsgId") == null instead of using nullable data type - int?

like image 756
spring summer Avatar asked Sep 30 '15 01:09

spring summer


2 Answers

Thanks Paulius, tried with dynamic datatype count = param.Get<dynamic>("MsgId"); and it work as what I'm looking for.

like image 143
spring summer Avatar answered Nov 18 '22 04:11

spring summer


In my case it was due to the Id parameter in stored proc was set as IN and at last, I was also setting its value to LAST_INSERT_ID() whereas in my C# (Dapper code) it was made ParameterDirection.InputOutput.

After I made my stored proc ID as INOUT, the problem got resolved.

In short what I understood was that the Id parameter behaviour (IN/OUT/INOUT) should be in sync at both the places i.e in stored proc and C#.

like image 1
Koder101 Avatar answered Nov 18 '22 02:11

Koder101