我认为我目前在Entity Framework 6中以及可能在ADO.NET中遇到错误。由于有最后期限,所以我不确定是否可以等待此错误被修复,希望有人可以帮助我进行整洁的工作。
问题是查询在应为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上创建了一个问题:用户定义的表插入了错误的值
我想在参数化查询中使用用户定义的表,此问题说明了如何完成此操作: 实体框架存储过程表值参数
这是用于获取上述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 TextData Column处理了不正确的十进制输入
Select * from @AName
是作为占位符。我实际上是在表中加入一个更大的查询,我认为该查询与该问题无关,因为这已经以一种更简单的格式复制了该问题。
Database.SqlQuery
(而不是Database.ExecuteSqlCommand
)时,会在客户端中收到正确的值!
dataTable.Rows.Add(null,0.05m);
和检查什么查询它产生