Myślę, że obecnie mam błąd w Entity Framework 6 i prawdopodobnie ADO.NET. Ponieważ upłynął termin, nie jestem pewien, czy mogę poczekać na naprawienie tego błędu i mam nadzieję, że ktoś może mi pomóc w czystej pracy.
Problem polega na tym, że zapytanie używa wartości 1 i 5 w miejscach, w których powinno wynosić 0,01 i 0,05. Dziwnie jednak wydaje się, że 0,1 działa
Generowane zapytanie jest obecnie: (pochodzi z 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
Prawidłowy kod to:
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
Utworzyłem już problem na githubie: Tabela zdefiniowana przez użytkownika wstawia niepoprawną wartość
Chcę użyć tabeli zdefiniowanej przez użytkownika w moim sparametryzowanym zapytaniu, w tym pytaniu wyjaśniono, jak to zrobić: Entity Framework Procedura przechowywana Parametr Wartość parametru
Jest to kod C # używany do uzyskania powyższego kodu SQL
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());
I kod SQL, aby uzyskać tabelę zdefiniowaną przez użytkownika
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
EDYCJA:
Gert Arnold to rozgryzł. Na podstawie jego odpowiedzi znalazłem istniejący raport. SQL Server Profiler TextData Kolumna nieprawidłowo obsługuje dane dziesiętne
dataTable.Rows.Add(null,0.05m);
i sprawdzić, jakie zapytanie generujeSelect * from @AName
jest jak symbol zastępczy. W rzeczywistości dołączam do stołu w większym zapytaniu, które nie wydaje mi się istotne dla pytania, ponieważ już to replikuje problem w prostszym formacie.Database.SqlQuery
(zamiastDatabase.ExecuteSqlCommand
) otrzymuję prawidłowe wartości w kliencie!Odpowiedzi:
To dziwny artefakt Sql Profiler. Wartości są przesyłane poprawnie. Mogę to wykazać, tworząc bazę danych z typem zdefiniowanym przez użytkownika i jedną małą tabelą:
I wstawianie kilku wartości:
Następnie uruchamiam twój kod, lekko dostosowany:
(
MyContex
to tylko klasa dziedziczącaDbContext
i nic więcej)Jest tylko jedna wartość pomiędzy
0.001m
a0.03m
i to właśnie powraca zapytania :4
.Jednak profiler Sql Server rejestruje to:
I w SSMS, który zwraca rekord nr 2.
Myślę, że ma to związek z ustawieniami regionalnymi i separatorami dziesiętnymi pomieszanymi z separatorami grup dziesiętnych gdzieś w logowaniu.
źródło
Szczerze mówiąc, nie mam tego samego problemu co ty:
To jest mój dziennik Profiler:
Próbowałem EntityFramework w wersji 6.2.0 i 6.3.0 i 6.4.0 i żaden z nich nie pokazuje problemu:
Ponadto testuję ADO.NET i mam ten sam wynik:
Używam Visual Studio 2017, .NET Framework 4.6.1 i Microsoft SQL Server Enterprise (64-bit)
źródło