কীভাবে এসকিউএল সার্ভারের সময়সীমা ব্যতিক্রমগুলি ধরা যায়


117

আমার বিশেষত এসকিউএল সার্ভারের টাইমআউট ব্যতিক্রমগুলি ধরা দরকার যাতে সেগুলি অন্যরকমভাবে পরিচালনা করা যায়। আমি জানি যে আমি স্কেলএক্সসেপশনটি ধরতে পারি এবং তারপরে বার্তাটির স্ট্রিংয়ে "টাইমআউট" রয়েছে কিনা তা পরীক্ষা করে দেখতে পারি তবে এটি করার আরও ভাল উপায় আছে কিনা তা ভাবছিলাম?

try
{
    //some code
}
catch (SqlException ex)
{

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}

আপনি কি কানেকশনটাইমআউট বা কমান্ডটাইমআউট খুঁজছেন, অর্থাৎ আপনি কি সংযোগটি ব্যর্থ হওয়ার প্রত্যাশা করছেন বা এক্সিকিউটেড কমান্ডটি ব্যর্থ হবে?
এডোসফট

আমি একটি কমান্ডটাইমআউট খুঁজছি, যা আমি মনে করি 30 সেকেন্ডের একটি ডিফল্ট সেট করা আছে
ব্রোডি

উত্তর:


157

সময়সীমা পরীক্ষা করার জন্য, আমি বিশ্বাস করি আপনি প্রাক্তন সংখ্যাটি পরীক্ষা করেছেন। যদি এটি -2 হয়, তবে আপনার সময়সাপেক্ষ পরিস্থিতি রয়েছে।

-2 হ'ল সময়সীমার জন্য ত্রুটি কোড, এসকিউএল সার্ভারের MDB ড্রাইভার DBNETLIB থেকে ফিরে আসে। এটি রিফ্লেক্টর ডাউনলোড করে দেখা যায় এবং সিস্টেমে.ডাটা.এসএকএলসিপ্লায়েন্ট.টিডিএসইউএমএস এর জন্য TIMEOUT_EXPIRED এর জন্য অনুসন্ধান ।

আপনার কোড পড়তে হবে:

if (ex.Number == -2)
{
     //handle timeout
}

ব্যর্থতা প্রদর্শনের কোড:

try
{
    SqlConnection sql = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=YourServer,1433;Initial Catalog=YourDB;Integrated Security=SSPI;");
    sql.Open();

    SqlCommand cmd = sql.CreateCommand();
    cmd.CommandText = "DECLARE @i int WHILE EXISTS (SELECT 1 from sysobjects) BEGIN SELECT @i = 1 END";
    cmd.ExecuteNonQuery(); // This line will timeout.

    cmd.Dispose();
    sql.Close();
}
catch (SqlException ex)
{
    if (ex.Number == -2) {
        Console.WriteLine ("Timeout occurred");
    }
}

হ্যাঁ, আমি এই মুহুর্তে যা করছি তা খুব বেশি, তবে এটি -2
ব্রোডি

12
রেড গেটের রিফ্লেক্টরটি ডাউনলোড করুন এবং TIMEOUT_EXPIRED অনুসন্ধান করুন। এটি System.Data.SqlClient.TdsEnums এ বাস করে এবং এর মান -২ হয়। : ও)
জোনাথন

2
যাদের প্রতিফলকের অ্যাক্সেস নেই তাদের জন্য: লিঙ্ক
অংকিত

4
@ ব্রোডি সে কারণেই আপনার এটির জন্য একটি ধ্রুবক তৈরি করা উচিত এবং ধ্রুবক সম্পর্কে একটি মন্তব্যে "যাদু" মানটি কোথা থেকে এসেছে তা আপনি ব্যাখ্যা করতে পারেন।
জেসন এল।

18

এখানে: http://www.tech-archive.net/ আর্কাইভ / ডটনেট / মাইক্রোসফট.পলিটিক.ডটনেট.ফ্রেমেওয়ার্ক.এডনেট / ২০০6-10/msg00064.html

আপনি টমাস উইংগার্টনার লিখেছেন:

সময়সীমা: SqlException.Number == -2 (এটি একটি ADO.NET ত্রুটি কোড)
সাধারণ নেটওয়ার্ক ত্রুটি: SqlException.Number == 11
ডেডলক: SqlException.Number == 1205 (এটি একটি এসকিউএল সার্ভার ত্রুটি কোড)

...

সময়সীমা ব্যতিক্রম হিসাবে আমরা "জেনারেল নেটওয়ার্ক ত্রুটি" পরিচালনা করি। এটি কেবল বিরল পরিস্থিতিতে যেমন ঘটে যখন আপনার আপডেট / সন্নিবেশ / মুছা ক্যোয়ারী একটি দীর্ঘ চলমান ট্রিগার উত্থাপন করবে।


6

সি # 6 এর জন্য আপডেট হয়েছে:

    try
    {
        // some code
    }
    catch (SqlException ex) when (ex.Number == -2)  // -2 is a sql timeout
    {
        // handle timeout
    }

দেখতে খুব সহজ এবং সুন্দর !!


0

স্কেলএক্সসেপশন.এররর কোড কোডটির কি মূল্য? আপনি কি সঙ্গে কাজ করতে পারেন?

সময়সীমা থাকা অবস্থায়, 2121232060 এর জন্য কোডটি পরীক্ষা করা মূল্যবান হতে পারে ।

আমি আপনার ডেটা কোডে এটি একটি স্থিতিশীল কনস্ট হিসাবে সেট আপ করব।


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

@ এরিকটি সঠিক - এটি স্কেলএক্সসেপশন ধরণের জন্য একটি HRESULT কোড, ব্যতিক্রমের উত্সের জন্য নয়।
কোডকাইজন

0

আমি নিশ্চিত নই তবে আমরা যখন সময় নির্বাহ করি বা সময় কমান্ড আউট করি তখন ক্লায়েন্ট এসকিউএল সার্ভারে একটি "ABORT" প্রেরণ করে তারপরে সহজেই ক্যোয়ারী প্রক্রিয়াটি বাতিল করে দেয়। কোনও লেনদেন আবার ঘুরিয়ে দেওয়া হয় না, কোনও লক প্রকাশ হয় না। এই সমস্যাটি সমাধান করার জন্য আমি সঞ্চিত পদ্ধতিতে লেনদেন সরিয়ে ফেলি এবং আমার। নেট কোডে এসকিউএল লেনদেন ব্যবহার করি


-2

যখন কোনও ক্লায়েন্ট ABORT প্রেরণ করে, কোনও লেনদেন পিছনে ফিরে আসে না। এই আচরণটি এড়াতে আমাদের https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15 অন ​​এসইএক্সএক্সএক্সএবএআরটি ব্যবহার করতে হবে


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