我认为我目前在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处理了不正确的十进制输入
这是一个奇怪的Sql Profiler工件。值已正确传输。我可以通过使用用户定义的类型和一个小表创建数据库来证明这一点:
CREATE TABLE [dbo].[Values](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Value] [decimal](16, 5) NOT NULL,
CONSTRAINT [PK_Values] PRIMARY KEY CLUSTERED ([Id] ASC) ON [PRIMARY]
GO
并插入几个值:
Id Value
----------- ---------------------------------------
1 10.00000
2 1.00000
3 0.10000
4 0.01000
然后我运行您的代码,稍作修改:
DataTable dataTable = new DataTable();
dataTable.Columns.Add("value1", typeof(decimal));
dataTable.Columns.Add("value2", typeof(decimal));
dataTable.Rows.Add(0.001m, 0.03m);
List<SqlParameter> Parameters = new List<SqlParameter>();
Parameters.Add(new SqlParameter("@AName", SqlDbType.Structured) { Value = dataTable, TypeName = "dbo.someUDT" });
using(var context = new MyContext(connStr))
{
var query = "Select v.Id from dbo.[Values] v, @AName a "
+ " where v.Value BETWEEN a.value1 AND a.value2";
var result = context.Database.SqlQuery<int>(query, Parameters.ToArray());
}
(MyContex
只是一个继承自DbContext
其他类的类)
和之间只有一个值0.001m
,0.03m
而这恰恰是查询返回的内容:4
。
但是,Sql Server事件探查器记录以下内容:
declare @p3 dbo.someUDT
insert into @p3 values(1,3) -- See here: the log is warped
exec sp_executesql N'Select v.Value from dbo.[Values] v, @AName a where v.Value BETWEEN a.value1 AND a.value2',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
在SSMS中返回记录2。
我认为这与区域设置和十进制分隔符与日志记录中某处的十进制组分隔符混淆有关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句