কোনও এসকিউএল সংযোগ নিষ্পত্তি হওয়ার আগে আমাকে কী বন্ধ করতে হবে?


113

আমার অন্যান্য প্রশ্নে ডিসপোজেবল অবজেক্টগুলি সম্পর্কে , ব্যবহারের ব্লকটি শেষ হওয়ার আগে আমাদের কি ক্লোজ () কল করা উচিত?

using (SqlConnection connection = new SqlConnection())
using (SqlCommand command = new SqlCommand())
{
    command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)";
    command.CommandType = System.Data.CommandType.Text;

    connection.Open();
    command.ExecuteNonQuery();

    // Is this call necessary?
    connection.Close();
}

উত্তর:


107

আপনার যেহেতু ব্যবহারের ব্লক রয়েছে তাই এসকিউএলকম্যান্ডের ডিসপোজ পদ্ধতিটি কল করা হবে এবং এটি সংযোগটি বন্ধ করে দেবে:

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

1
এটি করে ._পুলগ্রুপ = নাল; মানে যে সংযোগটি আবার সংযোগ পুলে ফিরে পাচ্ছে না? সুতরাং আমি এন 1 সংযোগ আছে?
রই নমির

25

নেট রিফ্লেক্টর ব্যবহার থেকে স্কেল সংযোগ বিচ্ছিন্ন করা :

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }

    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

এটি ডিসপোজ () এর অভ্যন্তরে ক্লোজ () বলে


1
@ স্ট্যাটেনজোন: আপনি কি দয়া করে বলতে পারেন যে আপনি কীভাবে বিচ্ছিন্নকারী লাইন। নেট প্রতিফলক ব্যবহার করে সুবিধা গ্রহণ করবেন?
ওডিসিহ

3
@ ওডিসেহ কেবল ডাউনলোড করুন। নেট প্রতিস্থাপনকারী, রিফ্ল্যাক্টর.এক্সই চালান এবং আপনি যে কোনও নেট নেটএলএল (স্ট্যান্ডার্ড লাইব্রেরি সহ) খুলতে পারেন। এটি আপনাকে ভিজ্যুয়াল স্টুডিওর অবজেক্ট ব্রাউজারের মতো একটি গাছের কাঠামো সরবরাহ করে, তবে আপনি যে কোনও শ্রেণি বা পদ্ধতিতে ডান ক্লিক করতে পারেন এবং "বিচ্ছিন্ন" ক্লিক করতে পারেন এটি আপনাকে সি # বা ভিবিতে উত্সটি ফিরিয়ে দেবে, আপনি যে কোনওটিতে নির্বাচিত করেছেন অপশন।
statenjason

20

ব্যবহারের কীওয়ার্ডটি সংযোগটি সঠিকভাবে বন্ধ করবে তাই ক্লোজ করতে অতিরিক্ত কল প্রয়োজন হয় না।

এসকিউএল সার্ভার সংযোগ পুলিংয়ের উপর এমএসডিএন নিবন্ধ থেকে :

"আমরা দৃ strongly়ভাবে প্রস্তাব দিচ্ছি যে আপনি সংযোগটি ব্যবহার শেষ করার পরে সর্বদা বন্ধ করুন যাতে সংযোগটি পুলটিতে ফিরে আসবে You আপনি সংযোগ বস্তুর বন্ধ বা নিষ্পত্তি পদ্ধতিগুলি ব্যবহার করে বা কোনও অভ্যন্তরের সমস্ত সংযোগ খোলার মাধ্যমে এটি করতে পারেন সি # তে স্টেটমেন্ট ব্যবহার করে "

স্কেল সংযোগের আসল বাস্তবায়ন। NET রিফ্লেক্টরটি ব্যবহার করে নিন:

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

1
এমএসডিএন লিঙ্কের জন্য +1 - আমি প্রতিচ্ছবি পছন্দ করি next পরের লোকের মতো আইএলস্পাই, তবে আমার উত্তরগুলি খুঁজতে আমি যেখানে যেতে চাই সেগুলিতে ডকগুলি হয়।
mlhDev



3

না, Dispose()যেভাবেই হোক আপনার জন্য ইউজিং ব্লক কল রয়েছে, সুতরাং কল করার দরকার নেই Close()


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

6
এটি কি অন্যভাবে নয় - Dispose()কলগুলি Close(), বিপরীত নয়?
টাউন

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

2

না, নিষ্পত্তি কল করার আগে কোনও সংযোগ বন্ধ করার দরকার নেই।

কিছু বস্তু, যেমন (এসকিউএল সংযোগগুলি) আফের কলিংকে পুনরায় ব্যবহার করা যেতে পারে, তবে ডিসপোজ কল করার পরে নয়। অন্যান্য অবজেক্টের জন্য ক্লোজ কল করা ডিসপোজ কল করার সমান। (ম্যানুয়ালসেটসেন্ট এবং স্ট্রিমগুলি আমার মনে হয় এরকম আচরণ করে)


1

না, SqlCnnication বর্গটি আইডিসপোজেবল থেকে উত্তরাধিকার সূত্রে আসে এবং যখন (সংযোগের জন্য) সংযুক্তি ব্যবহারের শেষ হয়, তখন এটি স্বয়ংক্রিয়ভাবে ডিস্কপোজকে এসকিএল সংযোগ শ্রেণিতে কল করে।

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