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

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

مثبّترائج
بدأه bashmohandes في 13 نوفمبر 2005 · 41 رد · 41,478 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

مقدمة

أرى أن الجميع يطلب أسئلة حول ال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

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#2

للرفع

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#3

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

#4

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

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

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

#5

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

اجملت وأوجزت

#6

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

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

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

تم تعديل هذه المشاركة بواسطة Ahmed H. Alawady في 15 نوفمبر 2005 في 17:36

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#7

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

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

#8

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

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#9

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

أولا -- لست أرى السعادة جمع مال ** ولكن التقي هو السعيد

ثانيا-- وإن ضاق رزق اليوم فاصبر إلى غد *** عسى نكبات الدهر عنك تزول

ثالثا-- أصون عرضي بمالي لا أدنسه *** لا بارك الله بعد العرض بالمال

وأخيرا -- قال تعالى ( يوم لا ينفع مال ولا بنون إلا من أتى الله بقلب سليم )

#10

البحث في النهاية هو 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 لمزيد من المعلومات

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#11
bashmohandes كتب:
حتى أتيح فرصة للأسئلة و لكن الواضح أنه لا يوجد أي أسئلة عن الموضوع أو استفسارات

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

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

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

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

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

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

#13

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

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

وتقييمها..

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

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

#14

بارك الله فيك يا 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

رأس الحكمة الإيمان بالله

#15

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

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#16

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

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#17

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

شكرا مرة أخرى

3424.gif
#18

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

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

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

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

وهكذا

to be continued

__________

#19

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

وفوق كل ذي علم عليم

والله اعلم

الملك ------>محمد ابو تريكة

abutreika.jpg

على اسم مصر التاريخ يقدر يقول ما شاء

أنا مصر عندي أحب وأجمل الأشياء

باحبها وهي مالكه الأرض شرق وغرب

وباحبها وهي مرميه جريحة حرب

باحبها بعنف وبرقة وعلى استحياء

واكرهها وألعن أبوها بعشق زي الداء

واسيبها واطفش في درب وتبقى هي ف درب

وتلتفت تلقيني جنبها في الكرب

والنبض ينفض عروقي بألف نغمة وضرب

على اسم مصر

#20

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

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

#21

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

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#22

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

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

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

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

وشكرا

اذا لم تزد شيئا علي الحياة فلا تكن انت زائدا عليها

#23

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

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

joseph.gif

logo.gif

CCNA 640-802

مدونتي

#24

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

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

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

لا إله إلا الله وحده لا شريك له له الملك و له الحمد يحى و يميت و هو على كل شيء قدير

#25

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

image-27.gif

concepteur realisateur java j2ee

php5 and asp

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