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 @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 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