Je pense que je rencontre actuellement un bogue dans Entity Framework 6 et peut-être ADO.NET. Puisqu'il y a une date limite, je ne suis pas sûr de pouvoir attendre que ce bogue soit corrigé et j'espère que quelqu'un pourra m'aider à faire le ménage.
Le problème est que la requête utilise les valeurs 1 et 5 aux endroits où elles devraient être 0,01 et 0,05. Cependant, étrangement, 0,1 semble fonctionner
La requête générée est actuellement: (obtenue à partir 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
Alors que le bon code serait:
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
J'ai déjà créé un problème sur github ici: Table définie par l'utilisateur insérant une mauvaise valeur
Je souhaite utiliser une table définie par l'utilisateur dans ma requête paramétrée, cette question explique comment procéder: Entity Framework Stored Procedure Table Value Parameter
Ceci est le code C # utilisé pour obtenir le code SQL ci-dessus
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());
Et du code SQL pour obtenir la table définie par l'utilisateur
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
EDIT:
Gert Arnold l'a compris. Sur la base de sa réponse, j'ai trouvé un rapport existant ici SQL Server Profiler TextData Column gère les entrées décimales de manière incorrecte
dataTable.Rows.Add(null,0.05m);
et vérifier quelle requête il génèreSelect * from @AName
c'est comme espace réservé. Je me joins en fait à la table dans une plus grande requête que je ne pensais pas pertinente pour la question car cela reproduit déjà le problème dans un format plus simple.Database.SqlQuery
(plutôt queDatabase.ExecuteSqlCommand
) je reçois les valeurs correctes dans le client!Réponses:
C'est un étrange artefact Sql Profiler. Les valeurs sont transférées correctement. Je peux démontrer qu'en créant une base de données avec votre type défini par l'utilisateur et une petite table:
Et en insérant quelques valeurs:
Ensuite, je lance votre code, légèrement adapté:
(
MyContex
est juste une classe héritée deDbContext
rien d'autre)Il n'y a qu'une seule valeur entre
0.001m
et0.03m
et c'est exactement ce que le rendement de la requête :4
.Cependant, Sql Server profiler enregistre ceci:
Et dans SSMS qui renvoie l'enregistrement n ° 2.
Je pense que cela a à voir avec les paramètres régionaux et les séparateurs décimaux mélangés avec des séparateurs de groupes décimaux quelque part dans la journalisation.
la source
Honnêtement, je n'ai pas le même problème que vous:
Voici mon journal de profileur:
J'ai essayé la version EntityFramework 6.2.0 & 6.3.0 & 6.4.0 et aucune de celles-ci ne montre le problème:
Aussi, je teste l'ADO.NET et ai le même résultat:
J'utilise Visual Studio 2017, .NET Framework 4.6.1 et Microsoft SQL Server Enterprise (64 bits)
la source