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
dataTable.Rows.Add(null,0.05m);
y verificar qué consulta generaSelect * 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 deDatabase.ExecuteSqlCommand
) ¡recibo los valores correctos en el cliente!Respuestas:
Es un extraño artefacto de Sql Profiler. Los valores se transfieren correctamente. Puedo demostrar eso creando una base de datos con su tipo definido por el usuario y una pequeña tabla:
E insertando un par de valores:
Luego ejecuto su código, ligeramente adaptado:
(
MyContex
es solo una clase que heredaDbContext
y nada más)Solo hay un valor entre
0.001m
y0.03m
y eso es exactamente lo que devuelve la consulta :4
.Sin embargo, el perfilador de SQL Server registra esto:
Y en SSMS que devuelve el registro # 2.
Creo que tiene que ver con configuraciones regionales y separadores decimales que se mezclan con separadores de grupos decimales en algún lugar del registro.
fuente
Honestamente, no tengo el mismo problema que tú:
Este es mi registro de perfil:
Intenté EntityFramework versión 6.2.0 y 6.3.0 y 6.4.0 y ninguno de estos muestra el problema:
Además, pruebo el ADO.NET y tengo el mismo resultado:
Estoy usando Visual Studio 2017, .NET Framework 4.6.1 y Microsoft SQL Server Enterprise (64 bits)
fuente