• 0
bashmohandes

هل تريد أن تنسى تعقيدات الADO.net

سؤال

بسم الله الرحمن الرحيم

مقدمة

أرى أن الجميع يطلب أسئلة حول الADO.net و أخرون يقدمون دروساً حول الADO.net ... هل هو بهذه الصعوبة؟؟؟

الصراحة في رأيي الADO.net حفظ أكثر منه برمجة فأنت تحاول حفظ خطوات كتابة أكواده أكثر من مجرد تعلمه ... و هنا تبدأ مشكلة تكرار كتابة الأكواد ....

ماهي مشكلة تكرار كتابة الأكواد؟؟ هي اعادة كتابة كود ينفذ نفس الوظيفة عشرات المرات في مشاريع مختلفة بدون محاولة الاستفادة من أنه لا يتغير من مشروع لآخر أو يتغير غيراً طفيفاً

ما هو الحل؟؟؟

الحل يكون دائماً في طريقتين ...

الأولى تستخدم في حالات التكرار المتشابه 100% فهو تسلسل معين من الأكواد يتغير فيه فقط أسماء المتغيرات و في هذه الحالة يكون الحل هو عمل Wrapper لهذا الكود و الWrapper بالمعنى الحرفي هي الغلاف.. أي أننا نقوم بعمل DLL يحوي هذا الكود في شكل منسق و سهل مجرد Function Call بحيث يسهل العمل في المستقبل ..... و هذه الحالة تناسب الADO.net بقوة

الطريقة الثانية هي عمل Code Generators و هي في حالات التشابه الجزئي في الأكواد و نسبة التشابه تحدد مدى تعقيد الكود و هذه الحالة ليست نطاق دراستنا الآن و ان كنت سأتطرق لها قريباً ان شاء الله ....

عودة الى الADO.net

ببساطة الADO.net يحاول تقسيم استخدام الDatabase الى قسمين أو طريقتين الأولى هو الConnection Oriented أو الطريقة المتصلة و الطريقة الثانية هي ال Connectionless Oriented أو الطريقة المنقطعة (التعريب صعب فلا تضحك من فضلك :lol: )

كما أنه يوجد تقسيم أخر من حيث طبيعة العملية نفسها بمعنى أنه قسم العمليات الى Queries و NonQueries و Scalar

حيث الQueries هي استرجاع قيم و سجلات من قاعدة البيانات (مثال جمل الSelect) ...

و الNonQueries هي تغيير في الData المسجلة أو تعديل في شكل البناء الداخلي للجداول مثل عمليات (Update, Delete, Insert, Alter, Create ..etc)

أما الScalar فهي عملية قراءة و لكن ذات طبيعة Summarization أو اختصار للبيانات بعمل عملية محددة عليها مثل حساب المجموع أو المتوسط أو العدد ... الخ

و من هنا ظهرت الScenarios أو المواقف الثابتة المملة في الADO و سنحاول سرد الأكثر شيوعاً

1- بداية الConnection و هذا جزء ثابت دائماً و لهذا سأكتبه مرة واحدة ...

SqlConnection conn = new SqlConnection("my Connection String");

2- قراءة Records من الDatabase باتجاه ثابت (قراءة فقط) باستخدام الDataReader ----- من نوع Connection Oriented

SqlCommand command = new SqlCommand("Select * From tblUsers", conn);
try
{
conn.Open();
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
Console.WriteLine(reader["ColumnName"]);
}
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}

3- قراءة Data Bulk أو كمية من الData خبطة واحدة (باستخدام الDataSet) ----- من نوع Connectionless Oriented

SqlCommand command = new SqlCommand("Select * From tblUsers", conn);
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
try
{
conn.Open();
adapter.Fill(ds);
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
//Do Whatever You want with the dataset

4- اجراء عمليات تعديل أو حذف أو اضافة ------------

SqlCommand command = new SqlCommand("Delete From tblUsers Where Username='bashmohandes'", conn);
try
{
conn.Open();
command.ExecuteNonQuery();
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}

5-اجراء عمليات على الStored Procedure في حالة Stored Procedure تقرأ معلومات

و هذه هي الStored Procedure

Create Procedure sptblUserGetAll
AS
Select * From tblUser

و هذا الكود يقوم بالقراءة منها (Connection Oriented Mode)

SqlCommand command = new SqlCommand("sptblUserGetAll", conn);
command.CommandType = CommandType.StoredProcedure;
try
{
conn.Open();
SqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
Console.WriteLine(reader["ColumnName"]);
}
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}

و هذا الكود في حالة الConnectionLess Oriented

SqlCommand command = new SqlCommand("sptblUserGetAll", conn);
command.CommandType = CommandType.StoredProcedure;
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
try
{
conn.Open();
adapter.Fill(ds);
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
//Do Whatever You want with the dataset

6- استدعاء StoredProcedure تقوم بعمليات تعديل على الData

في هذا المثال عملية الحذف

Create Procedure sptblUserDeleteBySID
@SID Int
AS
Delete From tblUser Where SID = @SID

فتلاحظ أن هذه الStoredProcedure تحتاج الى Parameter من نوع int و يكون كود تنفيذها

SqlCommand command = new SqlCommand("sptblUserDeleteBySID", conn);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@SID", 10);
try
{
conn.Open();
command.ExecuteNonQuery();
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}

7- عمل Query من النوع العددي Scalar مثل عد الUsers في الTable

SqlCommand command = new SqlCommand("Select count(*) as num_of_users From tblUsers", conn);
int number;
try
{
conn.Open();
number = (int)command.ExecuteScalar();
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}

و هناك بعض السيناريوهات الأخرى و لكن ماسبق كان أشهرها و أكثرها استخداماً و ما كان حاضراً في ذهني الآن و ستجد أنك ستعيد كتابة هذه الأسطر مئات المرات كلما احتجت لتنفيذ هذه العمليات ------- تضييع وقت

و الحل بسيط و لن يأخذ منك ثواني

ماذا لو كتبت هذه الاسطر كfunctions في class واحدة سيكون العمل أبسط كثيراً و يسهل عملية اعادة الاستخدام

و تكون هذه الclass تتبع هذا الInterface

public interface MyADO
{
 void Open();

 void Close();

 SqlDataReader ExecuteReader(string SQL);

 DataSet ExecuteDataSet(string SQL);

 object ExecuteScalar(string SQL);

 int ExecuteNonQuery(string SQL);

 SqlDataReader ExecuteStoredProcedureReader(string spName, SqlParameter[] parameters);

 int ExecuteStoredProcedureNonQuery(string spName, SqlParameter[] parameters);
}

و أعتقد أنك ستشعر بالفرق عندما تكتب الCode بهذه الطريقة

MyAdoClass myAdo = new MyAdoClass();
DataSet ds = myAdo.ExecuteDataSet("Select * from tblUsers");

كما أن عمليات مثل اكتشاف الأخطاء و تصحيحها ستكون سهلة جداً

أرجو أن يكون الدرس سهل و مفيد و أن تكون الفكرة قد وصلت بوضوح

و قريباً دروس في المواضيع المتقدمة ان شاء الله

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

41 إجابة على هذا السؤال .

  • 0

للرفع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اشكرك اخي بشمهندس بداية موفقة وننتظر المزيد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

اخى باشمهندس فعلا موضوع جميل جدا ورائع وننتظر منك المزيد إن شاء الله

والله الموفق لما فيه الخير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

قشطة يا باشمهندس

اجملت وأوجزت

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته

جزاك الله خيرا يا أخي باشمهندس

ولكن لدي سؤال بسيط كانت لي مشاركة في نفس الموضوع :unsure: ، ليست المشاركة شئ ولكن اللى لفت إنتباهي أنه لم أجدها أصلا خير في أي مشكلة .

تم تعديل بواسطه Ahmed H. Alawady
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بصراحه اسلوب رائع جدا

ارجو ان تستمر :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبة للمشاركات لقد قمت باخفاء جميع مشاركات الشكر حتى أتيح فرصة للأسئلة و لكن الواضح أنه لا يوجد أي أسئلة عن الموضوع أو استفسارات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا ياباش مهندس, لكن طريقة البحث في ado.net ممكن تتحفنا بها ولك منا الدعاء بالخير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

البحث في النهاية هو Query أيضاً و يكتب من خلال جملة Select و اذا كنت تبحث عن كلمة في نص يمكنك استخدام Like هكذا

Select * From tblArticles Where Subject Like '%Egypt%'

فهذه الجملة تبحث في المقالات عن مقال يحتوي عنوانه كلمة Egypt و علامتي ال %% قبل و بعد الkeyword تدل على أن أي عدد من الحروف ممكن أن يسبق أو يلي الkeyword ...

و يوجد مجموعة من المعاملات المستخدمة مع Like غير % مثل _ و يمكنك العودة الى W3Schools.com لمعرفة المزيد من التفاصيل...

أيضاً لبحث أدق في النصوص يمكنك استخدام Full Text Indexing Service في ال Sql Server فقط و هي ستمكنك من استخدام كلمات أخرى في البحث مثل FreeText و Contains و يمكنك البحث داخل SQL Server Help على استخدام الFull Text Indexing Sevice لمزيد من المعلومات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
حتى أتيح فرصة للأسئلة و لكن الواضح أنه لا يوجد أي أسئلة عن الموضوع أو استفسارات

أنا متفهم رأي سيادتك ولكن أسأل الله أن يعينك ويوفقك ، فيوجد أناس كثيرون يتتبعون موضوعك وموضوع الأخ فادي فلذلك كن على يقين أنه يوجد أناس كثيرون يتتبعون مواضيعك ، فأرجوا أن لا تتوقف لإنتظار الردود حتى تنتهي من فكرة الموضوع ككل

فجزاك الله خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
فيوجد أناس كثيرون يتتبعون موضوعك وموضوع الأخ فادي فلذلك كن على يقين أنه يوجد أناس كثيرون يتتبعون مواضيعك ، فأرجوا أن لا تتوقف لإنتظار الردود حتى تنتهي من فكرة الموضوع ككل

كلام سليم جدا جدا

وجزاك الله خيرا :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

عندي طلب أجتاجة بشدة (وجميع مبرمجي ADO.NET)

برامج مولدات الأكواد

وتقييمها..

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

وشكراً لكم ولطرح هذا الموضوع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك يا bashmohandes .... لي تعليق واحد إذا سمحت..

في حالة استخدام الـ DataSet لا يوجد داعي لفتح Connection للـ Database لأن هذه هي وظيفة الـ DataAdapter

SqlCommand command = new SqlCommand("Select * From tblUsers", conn);
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
try
{
conn.Open();
adapter.Fill(ds);
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
//Do Whatever You want with the dataset

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكراً يا محمد على قوة الملاحظة فأنا كنت أقوم بعمل Copy & Paste للأكواد من بعض و أغير فيها و لم ألاحظ هذه النقطة... و يبدو أنني تعودت على رؤية الconn.Open قبل أستخدام أي شئ يتعلق بالDB

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالنسبة لموضوع مولدات الأكواد Code Generators فلي وقفة معها قريباً ان شاء الله في درسي القادم عن Three-Tier-Model و سأتطرق لهذا الموضوع ان شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا بش مهندس وجعله الله في ميزان حسناتك

شكرا مرة أخرى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الموضوع رائع الصراحة

كانت النقطة دة بتضايقني جدا جدا

ولقد بدأت في مثل هذا التوجه ولكن من جهة أخري

هي عمل Dll لكل مهمة معينة من البرامج التجارية .... مثلا dll تتمكن به من عمل الجرد

وهكذا

to be continued

__________

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا يا باشمهندس على التجميعه العسل دي للAdo سهلت علينا لف كتييير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لماذا توقف الموضوع ؟؟

ارجو أن يكون المانع خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الموضوع لم يتوقف و لكن تكملته في قسم تصميم التطبيقات باسم Three Tier Model Concepts

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا يا بشمهندس علي هذه التوليفة الرائعة

لكن لي ملحوظة بسيطة في جملة ال finally

finally
{
if(conn.state==connectionstate.open)
conn.close
}

هذا لكي يتاكد لديه اولا ان الاتصال قد فتح

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

على ما اظن الدرس هذي على c#

ياليت لو على البيسك الله لايهينكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

موضوع تمام التمام يا باشمهندس

وفرت علينا كتير من اللف و الدوران

جزاك الله خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا يا بشمهندس

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي ممكن سؤال.... *-)

عندما يكون عندي قاعدة بيانات... تربط كل اسم مستخدم مع رقمه السري..

فقط يوجد حقلان.. واحد لاسم المستخدم والآخر للرقم السري.

انا قمت بعمل برنامج للاضافة والتعديل والحذف من قاعدة البيانات... لكنني لم استطع ان اقوم بعملية ال query كما اريد.

انا اريد ان ادخل اسم المستخدم في الحقل المخصص له وأترك حقل كلمة السر فارغا... وعند الضغط على زر البحث.. اريد ان يظهر الرقم السري في الحقل المخصص له.

قد بحثت لعلي اجد طريقة لتحقيق ذلك فلم استطع.. حيث ان ال query لا تستطيع أت تجزم بأن ال Records العائدة من عملية البحث عددها 1 فقط.

في حالتي نعم سوف تقوم بإرجاع record واحد. لكن في ال ADO.NET ليس هناك ما يميز اذا كان البيانات العائدة من البحث هي record واحد فقط أم لا.

اريد أن ادخل اسم المستخدم وعند ضغط الزر تظهر الكلمة السرية لهذا المستخدم

هل توضحت الفكرة؟؟ *-)

عفوا اذ أني مبتدئ في هذا المجال وقد يكون الحل سخيفا... :blink:

-waf

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .