Saya pikir saya sedang mengalami bug di Entity Framework 6 dan mungkin ADO.NET. Karena ada tenggat waktu, saya tidak yakin saya bisa menunggu bug ini diperbaiki dan mudah-mudahan seseorang dapat membantu saya dengan pekerjaan yang bersih.
Masalahnya adalah bahwa kueri menggunakan nilai 1 dan 5 di tempat yang seharusnya 0,01 dan 0,05. Namun anehnya 0,1 tampaknya berfungsi
Permintaan yang dihasilkan saat ini adalah: (didapat dari 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
Sedangkan kode yang benar adalah:
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
Saya sudah membuat masalah pada github di sini: Tabel yang ditentukan pengguna memasukkan nilai yang salah
Saya ingin menggunakan tabel yang ditentukan pengguna dalam kueri parameterisasi, pertanyaan ini menjelaskan bagaimana hal ini dilakukan: Kerangka Kerja Stored Prosedur Tabel Nilai Parameter
Ini adalah kode C # yang digunakan untuk mendapatkan kode SQL di atas
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());
Dan kode SQL untuk mendapatkan tabel yang ditentukan pengguna
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
EDIT:
Gert Arnold menemukan jawabannya. Berdasarkan jawabannya, saya menemukan laporan yang ada di sini SQL Server Profiler TextData Kolom menangani Input Desimal secara tidak benar
Select * from @ANameini adalah sebagai placeholder. Saya benar-benar bergabung di atas meja dalam kueri yang lebih besar yang menurut saya tidak relevan dengan pertanyaan karena ini sudah mereplikasi masalah dalam format yang lebih sederhana.
Database.SqlQuery(bukannya Database.ExecuteSqlCommand) saya menerima nilai yang benar di klien!
dataTable.Rows.Add(null,0.05m);dan memeriksa permintaan apa yang dihasilkannya