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
Select * from @ANamec'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 que Database.ExecuteSqlCommand) je reçois les valeurs correctes dans le client!
dataTable.Rows.Add(null,0.05m);et vérifier quelle requête il génère