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
.