Dapper: Not able to parse floats (Error parsing column)

asp.net-mvc, dapper, sql-server

Solution

Seems like this is not Dapper specific, as I just verified the below snippet works as expected.

Try enumerating your column names explictly (instead of select *) so that the procedure returns exactly what should be mapped to `PaymentTransactions`. Its possible there is another non-decimal column that is misnamed?

This is using Dapper v1.13 on .Net45:

Procedure:

create procedure dbo.Test
as
select  [SubTotal] = cast('0.01' as decimal(18,2)) 
union all 
select null;

Linqpad:

void Main()
{
    using (IDbConnection cnn = GetOpenConnection())
    {
        var users = cnn.Query<Sale>("yak.dbo.test", new { }, commandType: CommandType.StoredProcedure);
        users.Dump();

    }
}

public static readonly string connectionString = "Data Source=.;Initial Catalog=tempdb;Integrated Security=True";

public static IDbConnection GetOpenConnection()
{
  var connection = new SqlConnection(connectionString);
  connection.Open();
  return connection;
}

public class Sale
{
   public decimal? SubTotal;
}

Returns:

Problem

I am retrieving data from SQL Server from a StoredProcedure using Dapper and I'm getting error `Specified cast is not valid.` and details: `Error parsing column 4 (SubTotal=0.00 - Decimal)` On SQL Server side the column `SubTotal` is `decimal(18, 2) NULLABLE` and on .NET side it's `decimal?`. The data being retrieved is `0.00`. I checked this answer: Dapper,decimal to double? Error parsing column X As per answer, I replaced `il.Emit(OpCodes.Ldtoken, unboxType);` with `il.Emit(OpCodes.Ldtoken, Nullable.GetUnderlyingType(unboxType) ?? unboxType);` on line 2360 and still getting the same error. Anyone has any ideas about this? Thanks. Update: I tried making column non-nullable. Also tried changing column to `float` (on SQL Server) and `double` (on .NET side). None of these worked and I was getting the same error. Then I changed column to `int` and now code works fine. However, I'm working with monetary values and would like to use floating point numbers. Will investigate further... I'm executing a stored procedure as follows `var transaction = this.db.Query<PaymentTransactions>("usp_PaymentTransactionsGetSingleIfPaid", new { registrationId }, commandType: CommandType.StoredProcedure);` The relevant part of the stored procedure that returns information is below. `SELECT * FROM PaymentTransactions WHERE RegistrationId = @registrationId AND TransactionStatus = 'SUCCESS';` UPDATE 2: Dapper is working fine. Maybe there was something wrong with my dev environment. All it took was VS restart.

Original source

Related problems