Tôi nghĩ rằng tôi hiện đang gặp một lỗi trong Entity Framework 6 và có thể là ADO.NET. Vì có thời hạn, tôi không chắc mình có thể đợi lỗi này được sửa và hy vọng ai đó có thể giúp tôi làm việc sạch sẽ.
Vấn đề là truy vấn sử dụng các giá trị 1 và 5 ở những nơi cần là 0,01 và 0,05. Tuy nhiên, thật kỳ lạ, 0,1 dường như đang hoạt động
Truy vấn được tạo hiện tại là: (nhận được từ 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
Trong khi mã chính xác sẽ là:
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
Tôi đã tạo một vấn đề trên github ở đây: Bảng do người dùng xác định chèn giá trị sai
Tôi muốn sử dụng bảng do người dùng xác định trong truy vấn được tham số hóa của mình, câu hỏi này giải thích cách thực hiện: Entity Framework Lưu trữ thủ tục Bảng tham số giá trị
Đây là mã C # được sử dụng để lấy mã SQL ở trên
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());
Và mã SQL để có được bảng do người dùng định nghĩa
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
EDIT:
Gert Arnold đã tìm ra nó. Dựa trên câu trả lời của anh ấy, tôi đã tìm thấy một báo cáo hiện có ở đây SQL Server Profiler TextData Cột xử lý các đầu vào thập phân không chính xác
Select * from @AName
là như giữ chỗ. Tôi thực sự đang tham gia trên bàn trong một truy vấn lớn hơn mà tôi không nghĩ là có liên quan đến câu hỏi vì điều này đã sao chép vấn đề ở định dạng đơn giản hơn.
Database.SqlQuery
(chứ không phải Database.ExecuteSqlCommand
) tôi nhận được các giá trị chính xác trong máy khách!
dataTable.Rows.Add(null,0.05m);
và kiểm tra xem nó tạo ra truy vấn nào