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
Select * 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
(zamiast Database.ExecuteSqlCommand
) otrzymuję prawidłowe wartości w kliencie!
dataTable.Rows.Add(null,0.05m);
i sprawdzić, jakie zapytanie generuje