স্কেলক্লিয়েন্ট ডিফল্ট এ আরটিএইচআবার্ট চালু করুন


32

প্রথম জিনিসগুলি: আমি এমএস এসকিউএল সার্ভার ২০০৮টি 80 এর সাথে সামঞ্জস্যের স্তরে ডেটাবেস সহ ব্যবহার করছি এবং নেট এর সাথে এটি সংযোগ করছি System.Data.SqlClient.SqlConnection

পারফরম্যান্স কারণে আমি একটি ইনডেক্স ভিউ তৈরি করেছি। ফলস্বরূপ, দৃশ্যে উল্লিখিত টেবিলগুলিতে আপডেটগুলি করা দরকার ARITHABORT ON। যাইহোক, প্রোফাইলার দেখায় যে SqlClient এর সাথে সংযোগ স্থাপন করছে ARITHABORT OFF, সুতরাং সেই টেবিলগুলির আপডেটগুলি ব্যর্থ হচ্ছে।

স্ক্যালক্লিয়েন্ট ব্যবহারের জন্য কি কোনও কেন্দ্রীয় কনফিগারেশন সেটিংস রয়েছে ARITHABORT ON? আমি যে সন্ধান করতে সক্ষম হয়েছি তা হ'ল ম্যানুয়ালি কার্যকর করতে হবে যে প্রতিবার কোনও সংযোগ খোলা হবে, তবে এটি করার জন্য বিদ্যমান কোড বেসটি আপডেট করা মোটামুটি বড় কাজ হবে তাই আমি আরও ভাল উপায় খুঁজতে আগ্রহী।

উত্তর:


28

আপাতদৃষ্টিতে পছন্দসই পদ্ধতি

আমি এই ধারণাটির মধ্যে ছিলাম যে অন্যদের দ্বারা নিম্নলিখিতগুলি ইতিমধ্যে পরীক্ষা করা হয়েছিল, বিশেষত কয়েকটি মন্তব্যের ভিত্তিতে। তবে আমার পরীক্ষাটি দেখায় যে এই দুটি পদ্ধতি সত্যই ডিবি স্তরে কাজ করে, এমনকি নেট থেকে সংযোগ করার সময়ও SqlClientএগুলি অন্যরা পরীক্ষা করেছেন এবং যাচাই করেছেন।

সার্ভার-ব্যাপী

আপনি বর্তমানে ব্যবহারকারী অপশন সার্ভার কনফিগারেশন সেটিংস সেট করতে পারেন যা বর্তমানে বিট-বুদ্ধিমান ORএড যা 64 (এর মান ARITHABORT) দিয়ে থাকে। আপনি যদি বিট-বুদ্ধিমান OR ( |) ব্যবহার না করে তবে এর পরিবর্তে একটি সরল অ্যাসাইনমেন্ট ( =) করেন তবে আপনি ইতিমধ্যে সক্ষম অন্য যে কোনও বিদ্যমান বিকল্প মুছবেন।

DECLARE @Value INT;

SELECT @Value = CONVERT(INT, [value_in_use]) --[config_value] | 64
FROM   sys.configurations sc
WHERE  sc.[name] = N'user options';

IF ((@Value & 64) <> 64)
BEGIN
  PRINT 'Enabling ARITHABORT...';
  SET @Value = (@Value | 64);

  EXEC sp_configure N'user options', @Value;
  RECONFIGURE;
END;

EXEC sp_configure N'user options'; -- verify current state

ডেটাবেস-স্তরের

এটি ALTER ডেটাবেস সেট এর মাধ্যমে প্রতি ডাটাবেস সেট করা যেতে পারে :

USE [master];

IF (EXISTS(
     SELECT *
     FROM   sys.databases db
     WHERE  db.[name] = N'{database_name}'
     AND    db.[is_arithabort_on] = 0
   ))
BEGIN
  PRINT 'Enabling ARITHABORT...';

  ALTER DATABASE [{database_name}] SET ARITHABORT ON WITH NO_WAIT;
END;

বিকল্প পদ্ধতি

খুব ভাল-সুসংবাদটি হ'ল আমি এই বিষয়টিতে অনেকগুলি অনুসন্ধান করেছি, কেবল বছরের পর বছর ধরে আরও অনেকে এই বিষয়টিতে অনেক অনুসন্ধান করেছে এবং আচরণটি কনফিগার করার কোনও উপায় নেই is এর SqlClient। কিছু এমএসডিএন ডকুমেন্টেশন সূচিত করে যে এটি কোনও সংযোগস্ট্রিংয়ের মাধ্যমে করা যেতে পারে, তবে এমন কোনও কীওয়ার্ড নেই যা এই সেটিংস পরিবর্তন করার অনুমতি দেয়। অন্য একটি নথি বোঝায় যে এটি ক্লায়েন্ট নেটওয়ার্ক কনফিগারেশন / কনফিগারেশন ম্যানেজারের মাধ্যমে পরিবর্তন করা যেতে পারে, তবে এটি সম্ভবত সম্ভব হয় না। অতএব, এবং দুর্ভাগ্যক্রমে, আপনাকে SET ARITHABORT ON;ম্যানুয়ালি কার্যকর করতে হবে । এখানে বিবেচনা করার কিছু উপায় রয়েছে:

যদি আপনি সত্তা ফ্রেমওয়ার্ক 6 (বা আরও নতুন) ব্যবহার করে থাকেন তবে আপনি চেষ্টা করতে পারেন:

  • ডাটাবেস ব্যবহার করুন। এক্সকিউটিএসএইচএলকম্যান্ড : context.Database.ExecuteSqlCommand("SET ARITHABORT ON;");
    আদর্শভাবে এটি একবার কার্যকর করা হবে, ডিবি সংযোগটি খোলার পরে, এবং প্রতিটি প্রশ্নের জন্য নয়।

  • উভয়ের মাধ্যমে একটি ইন্টারসেপ্টর তৈরি করুন :

    এই আপনি এসকিউএল আগেই মৃত্যুদন্ড কার্যকর করা হয়, যে ক্ষেত্রে আপনি কেবল সঙ্গে এটি পূর্বে ভী করতে সংশোধন করতে অনুমতি দেবে: SET ARITHABORT ON;। এখানে খারাপ দিকটি হ'ল এটি প্রতিটি ক্যোয়ারী অনুযায়ী হবে, যদি না আপনি যদি কোনও স্থানীয় পরিবর্তনশীল সংরক্ষণ করেন তবে এটি কার্যকর করা হয়েছে কিনা এবং প্রতিবারের জন্য পরীক্ষা করা (যা সত্যই তেমন অতিরিক্ত কাজ নয়, তবে ব্যবহার ExecuteSqlCommandহচ্ছে) সম্ভবত সহজ)।

এর মধ্যে যে কোনও একটিই আপনাকে বিদ্যমান কোড পরিবর্তন না করেই এক জায়গায় এটিকে পরিচালনা করতে দেয়।

ELSE , আপনি এটির মতো একটি মোড়ক পদ্ধতি তৈরি করতে পারেন:

public static SqlDataReader ExecuteReaderWithSetting(SqlCommand CommandToExec)
{
  CommandToExec.CommandText = "SET ARITHABORT ON;\n" + CommandToExec.CommandText;

  return CommandToExec.ExecuteReader();
}

এবং তারপরে কেবল বর্তমান _Reader = _Command.ExecuteReader();রেফারেন্সগুলি হতে হবে _Reader = ExecuteReaderWithSetting(_Command);

এটি করার ফলে সেটিংসকে একক স্থানে পরিচালনা করার অনুমতি দেওয়া হয় তবে কেবলমাত্র সর্বনিম্ন এবং সরল কোড পরিবর্তন প্রয়োজন যা বেশিরভাগ ফাইন্ড এন্ড রিপ্লেসমের মাধ্যমে করা যায়।

আরও ভাল ( অন্য অংশ 2), যেহেতু এটি একটি সংযোগ স্তরের সেটিংস, তাই এটি প্রতিটি স্ক্যালকম্যান্ড.এক্সেকিউট __ () কল অনুসারে কার্যকর করা দরকার না। সুতরাং এর জন্য একটি মোড়ক তৈরির পরিবর্তে এর জন্য ExecuteReader()একটি মোড়ক তৈরি করুন Connection.Open():

public static void OpenAndSetArithAbort(SqlConnection MyConnection)
{
  using (SqlCommand _Command = MyConnection.CreateCommand())
  {
    _Command.CommandType = CommandType.Text;
    _Command.CommandText = "SET ARITHABORT ON;";

    MyConnection.Open();

    _Command.ExecuteNonQuery();
  }

  return;
}

এবং তারপরে কেবল বিদ্যমান _Connection.Open();রেফারেন্সগুলি প্রতিস্থাপন করুন OpenAndSetArithAbort(_Connection);

উপরোক্ত উভয় ধারণা উভয়ই আরও ওও স্টাইলে প্রয়োগ করা যেতে পারে এমন একটি শ্রেণি তৈরি করে যা স্কেলকম্যান্ড বা স্কেল সংযোগকে প্রসারিত করে।

বা ভাল এখনো ( অন্য পার্ট 3), আপনি সংযোগ StateChange জন্য একটি ইভেন্ট হ্যান্ডলার তৈরি করব এবং সম্পত্তি সেট করতে পারেন থেকে সংযোগ পরিবর্তন Closedকরতে Openনিম্নরূপ:

protected static void OnStateChange(object sender, StateChangeEventArgs args)
{
    if (args.OriginalState == ConnectionState.Closed
        && args.CurrentState == ConnectionState.Open)
    {
        using (SqlCommand _Command = ((SqlConnection)sender).CreateCommand())
        {
            _Command.CommandType = CommandType.Text;
            _Command.CommandText = "SET ARITHABORT ON;";

            _Command.ExecuteNonQuery();
        }
    }
}

সেই জায়গায় এটির সাথে, আপনি কেবল যেখানে SqlConnectionউদাহরণ তৈরি করেন প্রতিটি জায়গায় নিম্নলিখিতগুলি যুক্ত করতে হবে :

_Connection.StateChange += new StateChangeEventHandler(OnStateChange);

বিদ্যমান কোডে কোনও পরিবর্তন দরকার নেই। আমি কেবল একটি ছোট কনসোল অ্যাপ্লিকেশনটিতে এই পদ্ধতিটি চেষ্টা করেছি, এর ফলাফল মুদ্রণ করে পরীক্ষা করে SELECT SESSIONPROPERTY('ARITHABORT');। এটি ফিরে আসে 1, তবে যদি আমি ইভেন্ট হ্যান্ডলারটি অক্ষম করি তবে এটি ফিরে আসে 0


সম্পূর্ণতার জন্য, এখানে কিছু জিনিস যা কার্যকর হয় না (তা মোটেই কার্যকর হয় না বা কার্যকরভাবে হয় না):

  • লগন ট্রিগার : ট্রিগারগুলি, একই অধিবেশন চলাকালীন এবং স্পষ্টভাবে শুরু হওয়া লেনদেনের মধ্যে চলতে থাকলেও এটি একটি উপ-প্রক্রিয়া এবং তাই এর সেটিংস ( SETকমান্ড, স্থানীয় অস্থায়ী টেবিল ইত্যাদি) এর স্থানীয় এবং এটি টিকে থাকে না do যে উপ-প্রক্রিয়া শেষ।
  • SET ARITHABORT ON;প্রতিটি সঞ্চিত পদ্ধতির শুরুতে যুক্ত করা:
    • বিদ্যমান প্রকল্পগুলির জন্য এটির প্রচুর কাজ প্রয়োজন, বিশেষত সঞ্চিত পদ্ধতির সংখ্যা বাড়ার কারণে
    • এটি অ্যাড-হকের অনুসন্ধানগুলিতে সহায়তা করে না

আমি এরিটিহবার্ট এবং এএনএসআই_ওয়ার্নিংস উভয়ই বন্ধ করে একটি সাধারণ ডাটাবেস তৈরির পরীক্ষা করেছি, এতে শূন্য একটি টেবিল তৈরি করেছি এবং এটি থেকে পড়ার জন্য একটি সহজ নেট ক্লায়েন্ট। .NL SqlClient স্কিএল প্রোফাইলে লগইন করতে এআইআরটিএবার্ট অফ এবং এএনএসআই_ওয়ার্নিংস সেট করার হিসাবে দেখিয়েছিল, এবং প্রত্যাশার মতো শূন্য দ্বারা বিভাজন নিয়েও প্রশ্নটি ব্যর্থ করেছিল। এটি দেখায় বলে মনে হচ্ছে যে ডিবি স্তরের পতাকা নির্ধারণের পছন্দসই সমাধান। নেট স্কেলক্লিয়েন্টের জন্য ডিফল্ট পরিবর্তন করার জন্য কাজ করবে না।
মাইক

সার্ভার-প্রশস্ত user_options সেটিংস কাজ করে না তা নিশ্চিত করতে পারে।
মাইক

আমি আরও পর্যবেক্ষণ করছি যে SELECT DATABASEPROPERTYEX('{database_name}', 'IsArithmeticAbortEnabled');1 টি ফিরে আসার সাথে সাথে , sys.dm_exec_sessions দেখায় বন্ধুত্ব বন্ধ হয়ে যায়, যদিও আমি প্রোফাইলারে কোনও সুস্পষ্ট এসইটি দেখতে পাই না। কেন এমন হবে?
অ্যান্ড্রু.রকওয়েল

6

বিকল্প 1

শঙ্করের সমাধান ছাড়াও , সমস্ত সংযোগের জন্য সার্ভার স্তরে পাটিগণিতের অ্যাওর্ট সেটিংটি সেট করা কাজ করবে:

EXEC sys.sp_configure N'user options', N'64'
GO
RECONFIGURE WITH OVERRIDE
GO

এসকিউএল ২০১৪ অনুসারে এটি সমস্ত সংযোগের জন্য চালু থাকার প্রস্তাব দেওয়া হয়েছে :

আপনার লগন সেশনে আপনার সর্বদা ARITHABORT সেট করা উচিত। ARITHABORT কে অফ এফ সেট করা নেতিবাচকভাবে ক্যোয়ারী অপ্টিমাইজেশানকে প্রভাবিত করতে পারে যার ফলে পারফরম্যান্স সমস্যার সমাধান হতে পারে।

সুতরাং এটি আদর্শ সমাধান বলে মনে হবে।

বিকল্প 2

যদি বিকল্প 1 কার্যকর না হয় এবং আপনি আপনার বেশিরভাগ এসকিউএল কলগুলির জন্য সঞ্চিত পদ্ধতি ব্যবহার করেন (যা আপনার উচিত, সঞ্চিত পদ্ধতি বনাম ইনলাইন এসকিউএল দেখুন ) তবে প্রতিটি প্রাসঙ্গিক সঞ্চিত পদ্ধতিতে কেবল বিকল্পটি সক্ষম করুন:

CREATE PROCEDURE ...
AS 
BEGIN
   SET ARITHABORT ON
   SELECT ...
END
GO

আমি বিশ্বাস করি যে এখানে সর্বোত্তম আসল সমাধান হ'ল কেবল আপনার কোডটি সম্পাদনা করা, কারণ এটি ভুল এবং অন্য কোনও সমাধান নিছক একটি কর্মক্ষেত্র।


আমি যখন মনে করি না যে এটি যখন নেট নেট সংযোগটি শুরু হয় তখন এটি এসকিউএল সার্ভারের জন্য এটি সেট করতে সহায়তা করে set ArithAbort off। আমি এমন কিছু প্রত্যাশা করছিলাম যা। নেট / সি # পাশে করা যায় be আমি অনুগ্রহটি রেখেছি, কারণ আমি প্রস্তাবটি দেখেছি।
হেনরিক স্টাউন পুলসন

1
.NET / C # পার্শ্বটি শঙ্করটি coveredেকে রাখে, সুতরাং এগুলি কেবলমাত্র একমাত্র বিকল্প।
লোলিডিবিএ 13

আমি বিকল্প 1 চেষ্টা করেছিলাম এবং এর কোনও প্রভাব ছিল না। নতুন সেশনগুলি এখনও অ্যারিটাবোর্ট = 0 হিসাবে দেখায় আমি এ থেকে কোনও সমস্যা পাচ্ছি না, কেবল সম্ভাব্য সমস্যার আগে এগিয়ে যাওয়ার চেষ্টা করছি।
মার্ক ফ্রিম্যান 20

4

আমি এখানে বিশেষজ্ঞ নই তবে আপনি নীচের মতো কিছু চেষ্টা করতে পারেন।

String sConnectionstring;
sConnectionstring = "Initial Catalog=Pubs;Integrated Security=true;Data Source=DCC2516";

SqlConnection Conn = new SqlConnection(sConnectionstring);

SqlCommand blah = new SqlCommand("SET ARITHABORT ON", Conn);
blah.ExecuteNonQuery();


SqlCommand cmd = new SqlCommand();
// Int32 rowsAffected;

cmd.CommandText = "dbo.xmltext_import";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = Conn;
Conn.Open();
//Console.Write ("Connection is open");
//rowsAffected = 
cmd.ExecuteNonQuery();
Conn.Close();

সূত্র: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/d9e3e8ba-4948-4419-bb6b-dd5208bd7547/


হ্যাঁ, এটি আমি নিজেই এটি প্রয়োগ করে বোঝাতে চাইছিলাম। জিনিসটি হ'ল আমি যে কোডবেসটির সাথে কাজ করছি তা ডিবি অ্যাক্সেস লেয়ারের ক্ষেত্রে বেশ কিছু প্রযুক্তিগত debtণ অর্জন করেছে, সুতরাং এটি করার জন্য আমাকে কয়েক শতাধিক পদ্ধতিতে রিফ্যাক্টর করতে হবে।
পিটার টেলর

2

স্কেলক্লিয়েন্টকে সর্বদা এরিচাবার্ট সেট করতে বাধ্য করার কোনও সেটিংস নেই, আপনার বর্ণনা অনুযায়ী আপনাকে এটি সেট করতে হবে।

মাইক্রোসফ্ট ডকুমেন্টেশন থেকে আকর্ষণীয়ভাবে সেট অ্যারিটাবার্টের জন্য : -

আপনার লগন সেশনে আপনার সর্বদা ARITHABORT সেট করা উচিত। ARITHABORT কে অফ এফ সেট করা নেতিবাচকভাবে ক্যোয়ারী অপ্টিমাইজেশানকে প্রভাবিত করতে পারে যার ফলে পারফরম্যান্স সমস্যার সমাধান হতে পারে।

এবং তবুও। নেট সংযোগটি ডিফল্টরূপে সেট আপ করার জন্য হার্ড-কোডড?

অন্য একটি বিষয় হিসাবে, এই সেটিংটির সাথে পারফরম্যান্স সম্পর্কিত সমস্যাগুলি নির্ণয়ের সময় আপনাকে খুব সতর্কতা অবলম্বন করতে হবে। বিভিন্ন সেট অপশনগুলির একই ফলাফলের জন্য বিভিন্ন ক্যোয়ারী পরিকল্পনার ফলাফল হবে। আপনার। নেট কোডটি পারফরম্যান্স সমস্যার (SET ARITHABORT OFF OFF) অভিজ্ঞতা নিতে পারে এবং তবুও আপনি যখন এসএসএমএস-এ একই টিএসকিউএল কোয়েরি চালান (ডিফল্টরূপে এটিশক্তি সেট করুন) এটি ঠিক আছে be এটি কারণ। নেট ক্যোয়ারী পরিকল্পনাটি পুনরায় ব্যবহৃত হবে না এবং একটি নতুন পরিকল্পনা উত্পন্ন হবে। এটি সম্ভাব্য উদাহরণস্বরূপ কোনও প্যারামিটার স্নিফিং সমস্যাটি দূর করতে পারে এবং আরও ভাল পারফরম্যান্স দিতে পারে।


1
@ হেনরিকস্টাটনপলসন - আপনি যদি 2000 (বা 2000 সামঞ্জস্যতা স্তর) ব্যবহার করে আটকে না থাকেন তবে তাতে কোনও পার্থক্য নেই। এটি ANSI_WARNINGSপরবর্তী সংস্করণগুলিতে অন্তর্ভুক্ত এবং সূচিযুক্ত দর্শনগুলির মতো জিনিসগুলি ঠিকঠাক কাজ করে।
মার্টিন স্মিথ 21

নোট করুন। নেট এড়িশাবার্ট সেট আপ করতে হার্ড-কোডড নয়SSMS এটা সেটিং ডিফল্ট উপর । । নেট কেবল সংযোগ করছে এবং সার্ভার / ডাটাবেস ডিফল্ট ব্যবহার করছে। এসএসএমএসের ডিফল্ট আচরণ সম্পর্কে অভিযোগকারী ব্যবহারকারীদের সম্পর্কে আপনি এমএস কানেক্টে সমস্যাগুলি খুঁজে পেতে পারেন। ARITHABORT ডক পৃষ্ঠায় সতর্কতা নোট করুন
বেকন বিটস

2

যদি এটি কাউকে কিছুটা সময় সাশ্রয় করে তবে আমার ক্ষেত্রে (সত্তা ফ্রেমওয়ার্ক কোর ২.০.৩, এএসপি.নেট কোর এপিআই, এসকিউএল সার্ভার ২০০৮ আর 2):

  1. EF কোর 2.0 তে কোনও ইন্টারসেপ্টর নেই (আমি মনে করি তারা খুব শীঘ্রই ২.১ এ উপলব্ধ হবে)
  2. বৈশ্বিক ডিবি সেটিং পরিবর্তন করা বা সেট করা user_optionsআমার পক্ষে গ্রহণযোগ্য ছিল না (তারা কাজ করে - আমি পরীক্ষা করেছি) তবে আমি অন্যান্য অ্যাপ্লিকেশনগুলিকে প্রভাবিত করার ঝুঁকি নিতে পারিনি।

SET ARITHABORT ON;শীর্ষে থাকা EF কোরের একটি অ্যাডহক ক্যোয়ারি কাজ করে না।

পরিশেষে, আমার জন্য যে সমাধানটি কাজ করেছিল তা হ'ল: সঞ্চিত প্রক্রিয়াটির সংমিশ্রণ, সেমিকোলোন দ্বারা বিচ্ছিন্ন SETহওয়ার আগে বিকল্পটির সাথে কাঁচা কোয়েরি হিসাবে ডাকা EXEC:

// C# EF Core
int result = _context.Database.ExecuteSqlCommand($@"
SET ARITHABORT ON;
EXEC MyUpdateTableStoredProc
             @Param1 = {value1}
");

মজাদার. EF কোর এর সাথে কাজ করার এই बारीকগুলি পোস্ট করার জন্য ধন্যবাদ। কেবল কৌতূহল: আপনি এখানে যা করছেন তা মূলত আমার উত্তরটিতে বিকল্প পদ্ধতির বিভাগের ইএলএসই উপ-বিভাগে উল্লিখিত মোড়কের বিকল্পটি কী করছেন ? আমি কেবল ভাবছিলাম কারণ আপনি আমার উত্তরে অন্যান্য পরামর্শগুলি উল্লেখ করেছেন তা হয় কাজ করছে না বা অন্যান্য সীমাবদ্ধতার কারণে কার্যকর নয়, তবে মোড়কের বিকল্পটি উল্লেখ করেনি।
সলোমন রুটজকি

@ সলোমনরুতজকি এটি এই বিকল্পটির সমতুল্য, এই উপেক্ষা সহ যে এটি কোনও সঞ্চিত প্রক্রিয়া চালানোতে সীমাবদ্ধ। আমার ক্ষেত্রে যদি আমি সেট অপশনের (কোনও ম্যানুয়ালি বা মোড়কের মাধ্যমে) কোনও কাঁচা আপডেট ক্যোয়ারী উপস্থাপন করি তবে এটি কাজ করে না। আমি যদি সঞ্চিত পদ্ধতির ভিতরে SET অপশনটি রাখি তবে এটি কার্যকর হয় না। একমাত্র উপায় ছিল SET অপশন করা এবং তারপরে একই ব্যাচে EXEC সঞ্চিত পদ্ধতি অনুসরণ করা। কোনভাবেই আমি মোড়ক তৈরির পরিবর্তে নির্দিষ্ট কলটি কাস্টমাইজ করতে বেছে নিয়েছি। শীঘ্রই আমরা এসকিউএল সার্ভার ২০১ to-এ আপডেট করব এবং আমি এটি পরিষ্কার করতে পারি specific আপনার উত্তরের জন্য ধন্যবাদ, যদি নির্দিষ্ট পরিস্থিতিগুলি বাতিল করতে সহায়ক হয়।
ক্রিস অ্যাম্লিনিক্যাক্স

0

ইএফ 6 এর জন্য সলোমন রুটি উত্তর সম্পর্কে বিল্ডিং :

using System.Data;
using System.Data.Common;

namespace project.Data.Models
{
    abstract class ProjectDBContextBase: DbContext
    {
        internal ProjectDBContextBase(string nameOrConnectionString) : base(nameOrConnectionString)
        {
            this.Database.Connection.StateChange += new StateChangeEventHandler(OnStateChange);
        }

        protected static void OnStateChange(object sender, StateChangeEventArgs args)
        {
            if (args.OriginalState == ConnectionState.Closed
                && args.CurrentState == ConnectionState.Open)
            {
                using (DbCommand _Command = ((DbConnection)sender).CreateCommand())
                {
                    _Command.CommandType = CommandType.Text;
                    _Command.CommandText = "SET ARITHABORT ON;";
                    _Command.ExecuteNonQuery();
                }
            }
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        ...

এটি System.Data.Commonএর DbCommandপরিবর্তে SqlCommandএবং এর DbConnectionপরিবর্তে ব্যবহার করে SqlConnection

কোনও এসকিউএল প্রোফাইলার ট্রেস নিশ্চিত করে, SET ARITHABORT ONলেনদেনে অন্য কোনও কমান্ড কার্যকর করার আগে সংযোগটি খোলে যখন প্রেরণ করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.