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 @AName
ini 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