我认为目前在实体框架6和可能的ADO.NET中遇到了一个bug。由于有截止日期,我不确定是否能等待修复此错误,并希望有人能帮助我找到一个干净的解决方法。
问题是查询在应该使用0.01和0.05的地方使用了1和5这些值。然而奇怪的是,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 存储过程表值参数
这是用于获取上面SQL代码的C#代码
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
)
编辑:
Gert Arnold找到了答案。根据他的答案,我在这里找到了一个现有的报告 SQL Server Profiler文本数据列错误地处理十进制输入
dataTable.Rows.Add(null,0.05m);
并检查它生成了什么查询吗? - rjs123431Database.SqlQuery
(而不是Database.ExecuteSqlCommand
)时,在客户端上收到了正确的值! - Gert Arnold