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
dataTable.Rows.Add(null,0.05m);
dan memeriksa permintaan apa yang dihasilkannyaSelect * 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
(bukannyaDatabase.ExecuteSqlCommand
) saya menerima nilai yang benar di klien!Jawaban:
Ini adalah artefak Sql Profiler yang aneh. Nilai-nilai ditransfer dengan benar. Saya dapat menunjukkan bahwa dengan membuat database dengan tipe yang Anda tentukan dan satu tabel kecil:
Dan menyisipkan beberapa nilai:
Lalu saya jalankan kode Anda, sedikit disesuaikan:
(
MyContex
Hanya kelas yang diwarisi dariDbContext
dan tidak ada yang lain)Hanya ada satu nilai antara
0.001m
dan0.03m
dan itulah apa yang kembali permintaan :4
.Namun, profiler Sql Server mencatat ini:
Dan di SSMS yang mengembalikan catatan # 2.
Saya pikir itu ada hubungannya dengan pengaturan regional dan pemisah desimal yang bercampur dengan pemisah kelompok desimal di suatu tempat di logging.
sumber
Jujur, saya tidak memiliki masalah yang sama seperti Anda:
Ini adalah Log Profiler saya:
Saya mencoba EntityFramework versi 6.2.0 & 6.3.0 & 6.4.0 dan tidak ada yang menunjukkan masalah:
Juga, saya menguji ADO.NET dan memiliki hasil yang sama:
Saya menggunakan Visual Studio 2017, .NET Framework 4.6.1 dan Microsoft SQL Server Enterprise (64-bit)
sumber