Acho que atualmente estou enfrentando um bug no Entity Framework 6 e possivelmente no ADO.NET. Como existe um prazo, não tenho certeza se posso esperar que esse bug seja corrigido e espero que alguém possa me ajudar com uma solução limpa.
O problema é que a consulta usa os valores 1 e 5 em locais onde deve ser 0,01 e 0,05. No entanto, estranhamente, 0,1 parece estar funcionando
A consulta gerada atualmente é: (obtida do 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
Enquanto o código correto seria:
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á criei um problema no github aqui: Tabela definida pelo usuário, inserindo valor errado
Desejo usar uma tabela definida pelo usuário em minha consulta parametrizada, esta pergunta explica como isso é feito: Entity Framework Stored Procedure Table Value Parameter
Este é o código C # usado para obter o código SQL acima
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());
E código SQL para obter a tabela definida pelo usuário
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
Edição:
Gert Arnold descobriu. Com base em sua resposta, encontrei um relatório existente aqui. A coluna TextData do SQL Server Profiler lida com entradas decimais incorretamente
dataTable.Rows.Add(null,0.05m);
e verificar o que consultá-lo geraSelect * from @AName
é um espaço reservado. Na verdade, estou ingressando na tabela em uma consulta maior que não achei relevante para a pergunta, pois isso já replica o problema em um formato mais simples.Database.SqlQuery
(em vez deDatabase.ExecuteSqlCommand
) recebo os valores corretos no cliente!Respostas:
É um artefato estranho do Sql Profiler. Os valores são transferidos corretamente. Eu posso demonstrar isso criando um banco de dados com seu tipo definido pelo usuário e uma pequena tabela:
E inserindo alguns valores:
Então eu executo seu código, um pouco adaptado:
(
MyContex
é apenas uma classe herdadaDbContext
e nada mais)Há apenas um valor entre
0.001m
e0.03m
e isso é exatamente o que a consulta retorna :4
.No entanto, o criador de perfil do Sql Server registra isso:
E no SSMS que retorna o registro # 2.
Eu acho que tem a ver com configurações regionais e separadores decimais se misturando com separadores de grupos decimais em algum lugar do log.
fonte
Honestamente, não tenho o mesmo problema que você:
Este é o meu log do Profiler:
Eu tentei a versão 6.2.0 e 6.3.0 e 6.4.0 do EntityFramework e nenhuma delas mostra o problema:
Além disso, eu testo o ADO.NET e tenho o mesmo resultado:
Estou usando o Visual Studio 2017, .NET Framework 4.6.1 e Microsoft SQL Server Enterprise (64 bits)
fonte