Creo que actualmente estoy experimentando un error en Entity Framework 6 y posiblemente en ADO.NET. Dado que hay una fecha límite, no estoy seguro de que pueda esperar a que se solucione este error y espero que alguien pueda ayudarme con una solución limpia.
El problema es que la consulta usa los valores 1 y 5 en lugares donde debería ser 0.01 y 0.05. Sin embargo, por extraño que parezca, 0.1 parece estar funcionando
La consulta generada actualmente es: (obtenida de SQL Server Profiler)
declare @p3 dbo.someUDT
insert into @p3 values(NULL,5)
insert into @p3 values(5,0.10)
insert into @p3 values(NULL,1)
insert into @p3 values(1,2)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
Mientras que el código correcto sería:
declare @p3 dbo.someUDT
insert into @p3 values(NULL,0.05)
insert into @p3 values(0.05,0.10)
insert into @p3 values(NULL,0.01)
insert into @p3 values(0.01,0.02)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
Ya creé un problema en github aquí: tabla definida por el usuario que inserta un valor incorrecto
Quiero usar una tabla definida por el usuario en mi consulta parametrizada, esta pregunta explica cómo se hace esto: Entity Framework Stored Procedure Table Value Parámetro
Este es el código C # utilizado para obtener el código SQL anterior
DataTable dataTable = new DataTable();
dataTable.Columns.Add("value1", typeof(decimal));
dataTable.Columns.Add("value2", typeof(decimal));
dataTable.Rows.Add(null,0.05m);
dataTable.Rows.Add(0.05m,0.1m);
dataTable.Rows.Add(null,0.01m);
dataTable.Rows.Add(0.01m,0.02m);
List<SqlParameter> Parameters = new List<SqlParameter>();
Parameters.Add(new SqlParameter("@AName", SqlDbType.Structured) { Value = dataTable , TypeName= "dbo.someUDT" });
dbContext.Database.ExecuteSqlCommand("Select * from @AName", Parameters.ToArray());
Y el código SQL para obtener la tabla definida por el usuario
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
EDITAR:
Gert Arnold lo descubrió. Según su respuesta, encontré un informe existente aquí. La columna de datos de datos del analizador de SQL Server maneja las entradas decimales incorrectamente
Select * from @AName
es como marcador de posición. De hecho, me estoy uniendo sobre la mesa en una consulta más grande que no pensé que fuera relevante para la pregunta, ya que esto ya replica el problema en un formato más simple.
Database.SqlQuery
(en lugar de Database.ExecuteSqlCommand
) ¡recibo los valores correctos en el cliente!
dataTable.Rows.Add(null,0.05m);
y verificar qué consulta genera