Я думаю, что в настоящее время я испытываю ошибку в Entity Framework 6 и, возможно, ADO.NET. Поскольку существует крайний срок, я не уверен, что смогу дождаться исправления этой ошибки, и, надеюсь, кто-то может помочь мне с чистой работой вокруг.
Проблема в том, что в запросе используются значения 1 и 5 в тех местах, где они должны быть 0,01 и 0,05. Однако, как ни странно, 0.1, кажется, работает
Сгенерированный запрос в настоящее время: (полученный из 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
Хотя правильный код будет:
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
Я уже создал проблему на github здесь: пользовательская таблица вставляет неправильное значение
Я хочу использовать пользовательскую таблицу в моем параметризованном запросе, этот вопрос объясняет, как это делается: Параметр значения таблицы хранимых процедур Entity Framework
Это код C #, используемый для получения кода 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());
И SQL-код для получения пользовательской таблицы
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
РЕДАКТИРОВАТЬ:
Герт Арнольд понял это. На основании его ответа я нашел здесь существующий отчет. Столбец SQL Server Profiler TextData неправильно обрабатывает десятичные входные данные
dataTable.Rows.Add(null,0.05m);
и проверить, какой запрос он генерируетSelect * from @AName
как заполнитель. На самом деле я присоединяюсь к таблице в более крупном запросе, который, по моему мнению, не имеет отношения к этому вопросу, поскольку это уже повторяет проблему в более простом формате.Database.SqlQuery
(а неDatabase.ExecuteSqlCommand
), я получаю правильные значения в клиенте!Ответы:
Это странный артефакт Sql Profiler. Значения переданы правильно. Я могу продемонстрировать это, создав базу данных с вашим пользовательским типом и одной маленькой таблицей:
И вставив пару значений:
Затем я запускаю ваш код, слегка адаптированный:
(
MyContex
это просто класс, наследующийDbContext
и ничего больше)Существует только одно значение между
0.001m
и0.03m
и это именно то , что запрос возвращает :4
.Однако Sql Server profiler регистрирует это:
И в SSMS, который возвращает запись № 2.
Я думаю, что это связано с региональными настройками и десятичными разделителями, перепутанными с разделителями десятичных групп где-то в журнале.
источник
Честно говоря, у меня не такая же проблема, как у вас
Это мой журнал профилировщика:
Я пытался EntityFramework версии 6.2.0 и 6.3.0 и 6.4.0, и ни один из них не показывает проблему:
Кроме того, я тестирую ADO.NET и получаю такой же результат:
Я использую Visual Studio 2017, .NET Framework 4.6.1 и Microsoft SQL Server Enterprise (64-разрядная версия)
источник