Friday, March 03, 2006

ال 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 أو الطريقة المنقطعة (التعريب صعب فلا تضحك من فضلك laugh.gif)
كما أنه يوجد تقسيم أخر من حيث طبيعة العملية نفسها بمعنى أنه قسم العمليات الى
Queries و NonQueries و Scalar
حيث ال
Queries هي استرجاع قيم و سجلات من قاعدة البيانات (مثال جمل الSelect) ...
و ال
NonQueries هي تغيير في الData المسجلة أو تعديل في شكل البناء الداخلي للجداول مثل عمليات (Update, Delete, Insert, Alter, Create ..etc)
أما ال
Scalar فهي عملية قراءة و لكن ذات طبيعة Summarization أو اختصار للبيانات بعمل عملية محددة عليها مثل حساب المجموع أو المتوسط أو العدد ... الخ

و من هنا ظهرت ال
Scenarios أو المواقف الثابتة المملة في الADO و سنحاول سرد الأكثر شيوعاً
1- بداية الConnection و هذا جزء ثابت دائماً و لهذا سأكتبه مرة واحدة ...

CODE


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



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

CODE


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

CODE


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- اجراء عمليات تعديل أو حذف أو اضافة ------------

CODE


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

CODE

Create Procedure sptblUserGetAll
AS
Select * From tblUser



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

CODE

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


CODE


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
في هذا المثال عملية الحذف

CODE

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


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

CODE


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


CODE


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

CODE


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 بهذه الطريقة

CODE


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


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

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

1 comment:

Anonymous said...

Al Salam 3licom
i congratulate u for this educational blog ,
i learn more and more
but i want to ask Question
that i connot understand the last interface
thxs in advance