मुझे लगता है कि मैं वर्तमान में Entity Framework 6 और संभवतः ADO.NET में बग का अनुभव कर रहा हूं। चूंकि एक समय सीमा है, मुझे यकीन नहीं है कि मैं इस बग को ठीक करने के लिए इंतजार कर सकता हूं और उम्मीद है कि कोई व्यक्ति मेरे चारों ओर साफ काम करने में मदद कर सकता है।
समस्या यह है कि क्वेरी उन स्थानों पर मान 1 और 5 का उपयोग करती है जहां यह 0.01 और 0.05 होना चाहिए। हालाँकि विचित्र रूप से पर्याप्त 0.1 काम कर रहा है
वर्तमान में उत्पन्न क्वेरी है: (SQL सर्वर प्रोफाइलर से प्राप्त)
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 पर एक मुद्दा बनाया है: उपयोगकर्ता परिभाषित तालिका गलत मान सम्मिलित करती है
मैं अपनी पैरामीटर क्वेरी में उपयोगकर्ता परिभाषित तालिका का उपयोग करना चाहता हूं, यह प्रश्न बताता है कि यह कैसे किया जाता है: एंटिटी फ्रेमवर्क संग्रहीत प्रक्रिया प्रक्रिया मूल्य मान पैरामीटर
यह 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
)
संपादित करें:
गर्ट अर्नोल्ड ने यह पता लगाया। उनके जवाब के आधार पर मुझे एक मौजूदा रिपोर्ट मिली जिसमें SQL Server Profiler TextData Column गलत तरीके से Decimal Input को हैंडल करता है
Select * from @AName
प्लेसहोल्डर के रूप में है। मैं वास्तव में एक बड़ी क्वेरी में टेबल पर शामिल हो रहा हूं जो मुझे नहीं लगा कि यह सवाल प्रासंगिक था क्योंकि यह पहले से ही एक सरल प्रारूप में मुद्दे की नकल करता है।
Database.SqlQuery
(इसके बजाय Database.ExecuteSqlCommand
) मैं क्लाइंट में सही मान प्राप्त करता हूं!
dataTable.Rows.Add(null,0.05m);
और जाँच सकते हैं कि यह किस क्वेरी को उत्पन्न करता है