Я думаю, що в даний час я відчуваю помилку в Entity Framework 6 і, можливо, ADO.NET. Оскільки є термін, я не впевнений, що я можу дочекатися виправлення цієї помилки, і, сподіваюся, хтось може допомогти мені з чистою роботою.
Проблема полягає в тому, що запит використовує значення 1 і 5 в місцях, де він повинен бути 0,01 і 0,05. Однак досить дивно, здається, 0,1 працює
Наразі створений запит: (отримано від Profiler SQL Server)
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
)
EDIT:
Герт Арнольд зрозумів це. На основі його відповіді я знайшов існуючий звіт тут Стовпець профайлера SQL Server TextData стовпець обробляє десяткові вводи неправильно
Select * from @AName
це як заповнювач. Я фактично приєднуюсь до столу в більшому запиті, який, на мою думку, не мав відношення до питання, оскільки це вже копіює проблему в більш простому форматі.
Database.SqlQuery
(а не Database.ExecuteSqlCommand
), я отримую правильні значення в клієнті!
dataTable.Rows.Add(null,0.05m);
і перевірити, який запит він генерує