【发布时间】:2020-03-27 21:02:23
【问题描述】:
我认为我目前遇到了 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 上创建了一个问题:User defined table inserting wrong value
我想在我的参数化查询中使用用户定义的表,这个问题解释了这是如何完成的: Entity Framework Stored Procedure Table Value Parameter
这是用于获取上述 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 handles Decimal Inputs Incorrectly
【问题讨论】:
-
你可以试试这个
dataTable.Rows.Add(null,0.05m);并检查它生成的查询 -
@rjs123431 我之前试过,结果一样
-
您要创建一个新表并返回该表的所有值吗?对不起,但我不明白你真正想要什么。你能分享一下你的主要目标是什么吗?
-
@LuttiCoelho 很抱歉造成混乱,
Select * from @AName是占位符。我实际上是在一个更大的查询中加入表格,我认为这与问题无关,因为这已经以更简单的格式复制了问题。 -
奇怪的是,我确实看到了错误的 SQL,但是当我使用
Database.SqlQuery(而不是Database.ExecuteSqlCommand)时,我在客户端收到了正确的值!
标签: c# entity-framework entity-framework-6 ado.net user-defined-types