ฉันคิดว่าฉันกำลังประสบปัญหาใน Entity Framework 6 และอาจเป็น ADO.NET เนื่องจากมีกำหนดส่งฉันไม่แน่ใจว่าฉันสามารถรอให้ข้อผิดพลาดนี้ได้รับการแก้ไขและหวังว่าจะมีคนช่วยฉันทำความสะอาดรอบ ๆ ตัว
ปัญหาคือแบบสอบถามใช้ค่า 1 และ 5 ในตำแหน่งที่ควรเป็น 0.01 และ 0.05 อย่างไรก็ตามดูเหมือนว่าจะมีการใช้งาน 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 Stored Procedure Stored Procedure พารามิเตอร์ค่าพารามิเตอร์ของตาราง
นี่คือรหัส C # ที่ใช้เพื่อรับรหัส SQL ด้านบน
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 จัดการกับอินพุตทศนิยมไม่ถูกต้อง
Select * from @AName
เป็นตัวยึด จริง ๆ แล้วฉันกำลังเข้าร่วมในตารางในแบบสอบถามที่ใหญ่กว่าที่ฉันไม่คิดว่าเกี่ยวข้องกับคำถามเนื่องจากสิ่งนี้ได้จำลองปัญหาในรูปแบบที่เรียบง่ายขึ้นแล้ว
Database.SqlQuery
(มากกว่าDatabase.ExecuteSqlCommand
) ฉันจะได้รับค่าที่ถูกต้องในไคลเอนต์!
dataTable.Rows.Add(null,0.05m);
และตรวจสอบสิ่งที่มันสร้างแบบสอบถาม