الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل استخدام using يغني عن Dispose و Close

بدأه mamababadada في 14 ديسمبر 2010 · 4 رد · 463 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته أخواني الأعزاء انا استخدم الكود التالي في ملف cs في موقعي لفتح قاعدة البيانات وتنفيذ العمليات علهيا :

public class cDataConn
{
    private OracleConnection connection;
    private OracleCommand command;

	public string ReadData(string sql)
	{
        try
        {
            using (connection = new OracleConnection(WebConfigurationManager.ConnectionStrings["sgid"].ConnectionString))
            {
                using (command = new OracleCommand(sql, connection))
                {
                    connection.Open();
                    using (OracleDataReader dr = command.ExecuteReader())
                    {
                        dr.Read();
                        return dr.GetString(0);                        
                    }
                }
            }
        }
        catch(Exception ex)  
        {
              return ex.Message;
        }  

    }

}

فهل هذه الطريقة تغني عن استخدام cm.Dispose و cn.Dispose لان بصراحة صممت موقع يقوم بتسجيل معلومات والبحث فيها وعند تنزيله على السيرفر واستخدامه من قبل العاملين هناك تقريبا 30 مستخدم خلال ساعة فقط من عملهم على النظام ظهر عندي خطأ في السيرفر يخص قاعدة البيانات وهو ORA-01000 maximum open cursors

فتوقعت ان يكون ذلك بسبب برمجتي للتعامل مع قاعدة البيانات في عدم اغلاق مؤشر الاستعلام بعد الاستخدام وذلك بسبب قناعتي بان الطريقة اعلاه تفي بالغرض .

فهل انا بحاجه لعمل التالي :

SqlConnection cn = new SqlConnection(connectionString);
SqlCommand cm = new SqlCommand(commandString, cn);
cn.Open();
cm.ExecuteNonQuery();
cm.Dispose();
cn.Close();
cn.Dispose();

Many of life’s failures are people who did not realize how close they were to success when they gave up

Thomas Edison

#2

السلام عليكم

المفترض انها تغنى عن عمل ذلك , ولكن أنت لم تتبع الطريقة الصحيحة فالصحيح أن تفعل هكذا :

        using (SqlConnection conn = new SqlConnection )
        {

        }

وبهذا يكون مجال الكائن المعرف داخل using ويتم إزالته من الذاكرة ,ولكن بتعريفك لمتغير عام داخل أو لكل Class .فهذا أخل بالطريقة المتبعة . فهى تفرغ كل object تم تعريفه فى محتواها ولكن ليس لها دخل بالكائنات الخارجية .

ونقطة أخرى لمن يصل إلى هنا " هذة الطريقة هى احد الممارسات الحسنة والأخرى إستخدام try ,catch,finally فى مثل هذة العمليات "

أعد النظر فى هذا .

بالتوفيق إن شاء الله , يسر الله لكم

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 15 ديسمبر 2010 في 13:57

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#3
اقتباس

ونقطة أخرى لمن يصل إلى هنا " هذة الطريقة هى احد الممارسات الحسنة والأخرى إستخدام try ,catch,finally فى مثل هذة العمليات "

أعد النظر فى هذا .

معليش يعني اعد النظر في ماذا .. استخدام try ,catch,finally ام الطريقة الحسنة .

Many of life’s failures are people who did not realize how close they were to success when they gave up

Thomas Edison

#4
mamababadada كتب:

معليش يعني اعد النظر في ماذا .. استخدام try ,catch,finally ام الطريقة الحسنة .

السلام عليكم

كيف الحال , أقصد أن هاتين الطريقتين سواء using أو try هما من الممارسات الحسنة لمثل هذة العمليات وكان الحل الذى تقدم هو أن تجعل تعريف SqlConnection داخل using كما سبق فى الرد السابق .

شكراً على سؤالك .

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#5

يعطيك العافيه عزيزي احمد موسى .. شكرا وما قصرت

Many of life’s failures are people who did not realize how close they were to success when they gave up

Thomas Edison

مواضيع مشابهة