আপাতদৃষ্টিতে পছন্দসই পদ্ধতি
আমি এই ধারণাটির মধ্যে ছিলাম যে অন্যদের দ্বারা নিম্নলিখিতগুলি ইতিমধ্যে পরীক্ষা করা হয়েছিল, বিশেষত কয়েকটি মন্তব্যের ভিত্তিতে। তবে আমার পরীক্ষাটি দেখায় যে এই দুটি পদ্ধতি সত্যই ডিবি স্তরে কাজ করে, এমনকি নেট থেকে সংযোগ করার সময়ও 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;
প্রতিটি সঞ্চিত পদ্ধতির শুরুতে যুক্ত করা:
- বিদ্যমান প্রকল্পগুলির জন্য এটির প্রচুর কাজ প্রয়োজন, বিশেষত সঞ্চিত পদ্ধতির সংখ্যা বাড়ার কারণে
- এটি অ্যাড-হকের অনুসন্ধানগুলিতে সহায়তা করে না