stored guide framework dapper

guide - Cómo pasar un parámetro nulo con Dapper



dapper vs entity framework (1)

Tengo un procedimiento almacenado que tiene un parámetro sin valor predeterminado, pero puede ser nulo. Pero no sé cómo pasar nulo con Dapper. Puedo hacerlo bien en ADO.

connection.Execute("spLMS_UpdateLMSLCarrier", new { **RouteId = DBNull.Value**, CarrierId = carrierID, UserId = userID, TotalRouteRateCarrierId = totalRouteRateCarrierId }, commandType: CommandType.StoredProcedure);

Excepción:

System.NotSupportedException was caught Message=The member RouteId of type System.DBNull cannot be used as a parameter value Source=Dapper StackTrace: at Dapper.SqlMapper.LookupDbType(Type type, String name) in C:/Dev/dapper-git/Dapper/SqlMapper.cs:line 348 at Dapper.SqlMapper.CreateParamInfoGenerator(Identity identity) in C:/Dev/dapper-git/Dapper/SqlMapper.cs:line 1251 at Dapper.SqlMapper.GetCacheInfo(Identity identity) in C:/Dev/dapper-git/Dapper/SqlMapper.cs:line 908 at Dapper.SqlMapper.Execute(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType) in C:/Dev/dapper-git/Dapper/SqlMapper.cs:line 532 at Rating.Domain.Services.OrderRatingQueueService.UpdateLMSLCarrier(Int32 totalRouteRateCarrierId, Int32 carrierID, Int32 userID) in C:/DevProjects/Component/Main/Source/Rating/Source/Rating.Domain/Services/OrderRatingQueueService.cs:line 52 at Benchmarking.Program.OrderRatingQueue() in C:/DevProjects/Component/Main/Source/Benchmarking/Source/Benchmarking/Program.cs:line 81 at Benchmarking.Program.Main(String[] args) in C:/DevProjects/Component/Main/Source/Benchmarking/Source/Benchmarking/Program.cs:line 28 InnerException:

No puedo dejar el RouteId apagado, me da un error que dice que es necesario. No se puede utilizar null regular o me da otro error. No se puede cambiar el procedimiento almacenado, no me pertenece.


Creo que deberías poder hacerlo mediante la conversión null al tipo apropiado. Supongamos que RouteId es un entero:

connection.Execute("spLMS_UpdateLMSLCarrier", new { RouteId = (int?)null, CarrierId = carrierID, UserId = userID, TotalRouteRateCarrierId = totalRouteRateCarrierId }, commandType: CommandType.StoredProcedure);

El problema con el que se encuentra cuando usa el nulo normal es probable que el compilador no pueda inferir el tipo de RouteId en el tipo anónimo cuando solo usa el null sin la RouteId .