سؤال

هل يمكنني استخدام هذا النهج بكفاءة؟

using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString))
{
    cmd.Connection.Open();
    // set up parameters and CommandType to StoredProcedure etc. etc.
    cmd.ExecuteNonQuery();
}

قلقي هو :هل ستغلق طريقة التخلص الخاصة بـ SqlCommand (والتي يتم استدعاؤها عند الخروج من كتلة الاستخدام) كائن SqlConnection الأساسي أم لا؟

هل كانت مفيدة؟

المحلول

لا، التخلص من SqlCommand لن يؤثر على الاتصال.سيكون النهج الأفضل أيضًا هو التفاف SqlConnection في كتلة الاستخدام أيضًا:

using (SqlConnection conn = new SqlConnection(connstring))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(cmdstring, conn))
    {
        cmd.ExecuteNonQuery();
    }
}

بخلاف ذلك، لن يتغير الاتصال نظرًا لأنه تم التخلص من الأمر الذي كان يستخدمه (ربما هذا هو ما تريده؟).لكن ضع في اعتبارك أنه يجب التخلص من الاتصال أيضًا ، ومن المحتمل أن يكون أكثر أهمية للتخلص من أمر.

يحرر:

لقد اختبرت هذا للتو:

SqlConnection conn = new SqlConnection(connstring);
conn.Open();

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

conn.Dispose();  

تم التخلص من الأمر الأول عند الخروج من كتلة الاستخدام.كان الاتصال لا يزال مفتوحًا وجيدًا للأمر الثاني.

لذا فإن التخلص من الأمر بالتأكيد لا يؤدي إلى التخلص من الاتصال الذي كان يستخدمه.

نصائح أخرى

لن يكون SqlCommand.Dispose كافيًا لأن العديد من SqlCommand(s) يمكنها (إعادة) استخدام نفس SqlConnection.ركز تركيزك على SqlConnection.

أنا استخدم هذا النمط.لدي هذه الطريقة الخاصة في مكان ما في تطبيقي:

private void DisposeCommand(SqlCommand cmd)
{
    try
    {
        if (cmd != null)
        {
            if (cmd.Connection != null)
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
            }
            cmd.Dispose();
        }
    }
    catch { } //don't blow up
}

ثم أقوم دائمًا بإنشاء أوامر SQL واتصالات في كتلة محاولة (ولكن دون أن يتم تغليفها في كتلة استخدام) ولدي دائمًا كتلة نهائية على النحو التالي:

    finally
    {
        DisposeCommand(cmd);
    }

كائن الاتصال كونه خاصية لكائن الأمر يجعل كتلة الاستخدام غير ملائمة في هذه الحالة - ولكن هذا النمط ينجز المهمة دون ازدحام التعليمات البرمجية الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top