2012-06-19 22 views
26

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

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 puede salir del RouteId fuera, me da un error que dice que se requiere. No puedo usar un nulo regular, o bien me da otro error. No se puede cambiar el procedimiento almacenado, no me pertenece.

+0

¿Qué tipo es RouteId? – driis

+0

Es un int. Y antes de decir algo, recuerde, puedo hacerlo bien en ADO sin excepciones. –

Respuesta

47

Creo que deberías poder hacerlo lanzando null al tipo apropiado. Asumamos RouteId es un entero:

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

El problema está encontrando al utilizar nula regular es probable que el compilador no puede deducir el tipo de RouteId en el tipo anónimo cuando simplemente usando null sin el molde.

+0

perfecto. ¡Muchas gracias! este lugar es mucho mejor que msdn –

+0

Genial, recuerda aceptar/votar la respuesta si te ayudó :-) – driis

+0

Tuve que esperar 10 minutos antes de poder aceptar y soy demasiado nuevo para votar. Parece que solo deberías poder no rechazar mientras estés nuevo. Tonto –

Cuestiones relacionadas