나는 현재 Entity Framework 6 및 ADO.NET에 버그가 있다고 생각합니다. 마감 기한이 있기 때문에이 버그가 수정 될 때까지 기다릴 수 있으며 누군가가 깨끗한 작업을 도와 줄 수 있기를 바랍니다.
문제는 쿼리가 0.01과 0.05 여야하는 위치에서 값 1과 5를 사용한다는 것입니다. 그러나 이상하게도 0.1이 작동하는 것 같습니다
생성 된 쿼리는 현재 다음과 같습니다. (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 저장 프로 시저 테이블 값 매개 변수
위의 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 프로파일 러 TextData 열은 소수 입력을 잘못 처리합니다.
Select * from @AName
. 실제로 문제를 더 간단한 형식으로 복제하기 때문에 질문과 관련이 없다고 생각되는 더 큰 쿼리로 테이블에 참여하고 있습니다.
Database.SqlQuery
(대신 Database.ExecuteSqlCommand
)를 사용할 때 클라이언트에서 올바른 값을받습니다!
dataTable.Rows.Add(null,0.05m);
있으며 생성 어떤 쿼리 확인