সত্তা ফ্রেমওয়ার্কে ভুল সংজ্ঞা উত্পন্ন করে ব্যবহারকারীর সংজ্ঞায়িত টেবিল


10

আমি মনে করি আমি বর্তমানে সত্ত্বা ফ্রেমওয়ার্ক 6 এবং সম্ভবত ADO.NET- এ একটি বাগের অভিজ্ঞতা করছি। যেহেতু একটি সময়সীমা রয়েছে তাই আমি নিশ্চিত নই যে আমি এই বাগটি ঠিক হওয়ার জন্য অপেক্ষা করতে পারি এবং আশা করি কেউ আমার চারপাশে পরিষ্কার কাজ করতে সহায়তা করতে পারে।

সমস্যাটি হ'ল কোয়েরিটি যেখানে 0.01 এবং 0.05 হওয়া উচিত সেখানে 1 এবং 5 এর মান ব্যবহার করে। তবে অদ্ভুতভাবে যথেষ্ট 0.1 কাজ করছে বলে মনে হচ্ছে

উত্পন্ন উত্সত বর্তমানে: (এসকিউএল সার্ভার প্রোফাইলার থেকে প্রাপ্ত)

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

আমি ইতিমধ্যে এখানে গিথুব এ একটি সমস্যা তৈরি করেছি: ব্যবহারকারী নির্ধারিত সারণি ভুল মান সন্নিবেশ করানো

আমি আমার প্যারামিটারাইজড ক্যোয়ারিতে কোনও ব্যবহারকারী সংজ্ঞায়িত টেবিলটি ব্যবহার করতে চাই, এই প্রশ্নটি এটি কীভাবে হয় তা ব্যাখ্যা করে: সত্তা ফ্রেমওয়ার্ক সঞ্চিত প্রক্রিয়া সারণী মান মান পরামিতি

এটি উপরের এসকিউএল কোড পেতে ব্যবহৃত # সি কোড

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());

এবং এসকিউএল কোড ব্যবহারকারীর সংজ্ঞায়িত টেবিল পেতে

CREATE TYPE [dbo].[someUDT] AS TABLE
(
   [value1] [decimal](16, 5) NULL,
   [value2] [decimal](16, 5) NULL
)

সম্পাদনা:
জার্ট আর্নল্ড এটি আবিষ্কার করলেন। তার উত্তরের ভিত্তিতে আমি এখানে একটি বিদ্যমান প্রতিবেদন পেয়েছি এসকিউএল সার্ভার প্রোফাইলার টেক্সটডাটা কলাম দশমিক ইনপুটগুলি ভুলভাবে পরিচালনা করে


2
আপনি dataTable.Rows.Add(null,0.05m); কি এটি চেষ্টা করতে পারেন এবং এটি কী
উত্স

1
@ rjs123431 আমি এর আগেও চেষ্টা করেছি এবং এটি একই ফলাফল দেয়
জাস্ট কে

1
আপনি একটি নতুন টেবিল তৈরি করতে চান এবং টেবিলের সমস্ত মান ফিরিয়ে দিতে চান? দুঃখিত, তবে আপনি আসলে কী চান তা আমি বুঝতে পারি না। আপনি কি এইটির সাথে আপনার মূল লক্ষ্যটি ভাগ করতে পারেন?
লুট্টি কোয়েলহো

1
@ লুটিকোয়েলহো বিভ্রান্তির জন্য দুঃখিত, Select * from @ANameস্থানধারক হিসাবে। আমি আসলে বড় টেস্টে টেবিলের সাথে যোগ দিচ্ছি যা আমি মনে করি না যে এটি প্রশ্নের সাথে প্রাসঙ্গিক যেহেতু এটি ইস্যুটিকে আরও সহজ ফর্ম্যাটে ইতিমধ্যে প্রতিলিপি করেছে।
জুস্ট কে

2
আশ্চর্যের বিষয়টি হ'ল, আমি প্রকৃতপক্ষে ভুল এসকিউএল দেখতে পাচ্ছি, কিন্তু যখন আমি ব্যবহার করি Database.SqlQuery(এর চেয়ে Database.ExecuteSqlCommand) আমি ক্লায়েন্টে সঠিক মানগুলি পাই!
গার্ট আর্নল্ড

উত্তর:


11

এটি একটি অদ্ভুত এসকিএল প্রোফাইলার শিল্পকর্ম। মানগুলি সঠিকভাবে স্থানান্তরিত হয়। আমি আপনার ব্যবহারকারী সংজ্ঞায়িত প্রকার এবং একটি ছোট টেবিল দিয়ে একটি ডাটাবেস তৈরি করে তা প্রমাণ করতে পারি:

CREATE TABLE [dbo].[Values](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Value] [decimal](16, 5) NOT NULL,
 CONSTRAINT [PK_Values] PRIMARY KEY CLUSTERED ([Id] ASC) ON [PRIMARY]
GO

এবং কয়েকটি মান সন্নিবেশ করানো:

Id          Value
----------- ---------------------------------------
1           10.00000
2           1.00000
3           0.10000
4           0.01000

তারপরে আমি আপনার কোডটি চালাব, সামান্য অভিযোজিত:

DataTable dataTable = new DataTable();
dataTable.Columns.Add("value1", typeof(decimal));
dataTable.Columns.Add("value2", typeof(decimal));

dataTable.Rows.Add(0.001m, 0.03m);
List<SqlParameter> Parameters = new List<SqlParameter>();

Parameters.Add(new SqlParameter("@AName", SqlDbType.Structured) { Value = dataTable, TypeName = "dbo.someUDT" });

using(var context = new MyContext(connStr))
{
    var query = "Select v.Id from dbo.[Values] v, @AName a "
        + " where v.Value BETWEEN a.value1 AND a.value2";
    var result = context.Database.SqlQuery<int>(query, Parameters.ToArray());
}

( MyContexকেবলমাত্র একটি শ্রেণি যা উত্তরাধিকার সূত্রে প্রাপ্ত DbContextএবং অন্য কিছুই নয়)

তার মাঝে শুধু একটাই মান 0.001mএবং 0.03m এবং যে ঠিক কি ক্যোয়ারী আয় এর : 4

তবে, এসকিএল সার্ভারের প্রোফাইলারগুলি এটি লগ করে:

declare @p3 dbo.someUDT
insert into @p3 values(1,3) -- See here: the log is warped

exec sp_executesql N'Select v.Value from dbo.[Values] v, @AName a  where v.Value BETWEEN a.value1 AND a.value2',N'@AName [dbo].[someUDT] READONLY',@AName=@p3

এবং এসএসএমএসে যা রেকর্ড # 2 দেয়।

আমি মনে করি এটি আঞ্চলিক সেটিংস এবং দশমিক বিভাজকগুলি লগিংয়ের কোথাও দশমিক গ্রুপ বিভাজকের সাথে মিশে যেতে পারে।


1
লগ ইন করার বিষয়টি নিয়ে আমি কখনই ভাবিনি। বক্স চিন্তা থেকে দুর্দান্ত এবং এই সমাধান করার জন্য আপনাকে ধন্যবাদ!
জুস্ট কে

2
আমি এই বাগ রিপোর্ট পেয়েছিলাম আপনার উত্তরে ভিত্তি করে feedback.azure.com/forums/908035-sql-server/suggestions/... মনে হয় আমি শুধুমাত্র এক ছিল না।
কে

1

সত্যি বলতে কী, আপনার মতো আমারও তেমন সমস্যা নেই:

এটি আমার প্রোফাইলার লগ:

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

আমি এন্টি ফ্রেমওয়ার্ক সংস্করণ 6.2.0 এবং 6.3.0 এবং 6.4.0 চেষ্টা করেছি এবং এর কোনওটিই সমস্যাটি দেখায় না:

DataTable dataTable = new DataTable();
dataTable.Columns.Add("value1", typeof(decimal));
dataTable.Columns.Add("value2", typeof(decimal));

dataTable.Rows.Add(null, 0.05);
dataTable.Rows.Add(0.05M, 0.1M);
dataTable.Rows.Add(null, 0.01);
dataTable.Rows.Add(0.01, 0.02);
List<SqlParameter> Parameters = new List<SqlParameter>();

Parameters.Add(new SqlParameter("@AName", SqlDbType.Structured) { Value = dataTable, TypeName = "dbo.someUDT" });

var dbContext = new test01Entities();
dbContext.Database.ExecuteSqlCommand("Select * from @AName", Parameters.ToArray());

এছাড়াও, আমি ADO.NET পরীক্ষা করি এবং একই ফলাফল:

SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=Test01;Integrated Security=true;");
using (var cmd = new SqlCommand("[foo]", cn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cn.Open();
    cmd.Parameters.AddWithValue("@param1", 0.02);
    cmd.Parameters.AddWithValue("@param2", 0.020);
    cmd.ExecuteNonQuery();
}

আমি ভিজ্যুয়াল স্টুডিও 2017,। নেট ফ্রেমওয়ার্ক 4.6.1 এবং মাইক্রোসফ্ট এসকিউএল সার্ভার এন্টারপ্রাইজ (64-বিট) ব্যবহার করছি


4
আমি নিশ্চিত যে এটি ভাষা সেটিংসের সাথে সম্পর্কিত (মেশিন বনাম ডাটাবেস), সুতরাং আপনি কেবল ভাগ্যবান।
গার্ট আর্নল্ড

2
আমাকে যুক্ত করতে হবে যে আমি এবং @ জার্টআরনল্ড দু'জনেই একই দেশে বাস করে যা একটি খুব সম্ভবত ব্যাখ্যা করার কারণ কেন আমরা দুজনেই সমস্যাটি পুনরুত্পাদন করতে পারি
Joost K

2
@ জার্টআরনল্ড দয়া করে একটি নমুনা তৈরি করুন (ভিএস সলিউশন + এসকিউএল ডেটাবেস) এবং এটি ভাগ করুন। আমি ক্লু খুঁজে পাব।
এক্সএএমএটি

1
@ এক্সএএমএটি এটি একটি এসকিএল সার্ভার প্রোফাইলার বাগ যা তাই এটি আমাদের হাতের বাইরে। আপনি যদি পছন্দ করেন যে আপনি আপনার কোড চালানোর সময় বাগটি কখন উপস্থিত হয় তা দেখতে আপনার মেশিনের এবং ডাটাবেস সার্ভারের ভাষা সেটিংসের সাথে খেলতে পারেন, কিন্তু আইএমও যা শখের বিভাগে রয়েছে।
গার্ট আর্নল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.