Я думаю, что в настоящее время я испытываю ошибку в 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 неправильно обрабатывает десятичные входные данные
Select * from @AName
как заполнитель. На самом деле я присоединяюсь к таблице в более крупном запросе, который, по моему мнению, не имеет отношения к этому вопросу, поскольку это уже повторяет проблему в более простом формате.
Database.SqlQuery
(а не Database.ExecuteSqlCommand
), я получаю правильные значения в клиенте!
dataTable.Rows.Add(null,0.05m);
и проверить, какой запрос он генерирует