السلام عليكم
ناقشنا فى حلقة سابقه اهم كائنات ADO.NET فى الوضع المتصل وهذا رابط الموضوعADO.NET, الوضع المتصل
وساحاول هنا القاء الضوء على كائنات ADO.NET للوضع المنفصل
كائن مهئ البيانات DataAdapter
وهو يعتبر بمثابة جسر بين مخزن البيانات وعناصر ado.net مثل مجموعة البيانات او الجداول فعن طريقة يتم الاتصال وسحب البيانات من مخزن البياانات وبعد ذلك يمكن التعديل فيها وارجاعها الى مخزن البيانات ايضا عن طريق مهئ البيانات ،وقد تم تصميمه خصيصا للعمل مع الوضع المنفصل حيث يتم تحميل البيانات الى جهاز العميل ومن ثم العمل عليها هناك
انشاء مهئ البيانات والتعامل معه:
يتم انشاء كائن مهئ البيانات من الفئةOleDbDataAdapter باستخدام الكلمة المحجوزة new وقد تم اعادة تعريفoverloadsمنشئ الفئة اكثر من مرة
Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _ "Initial Catalog=Northwind;Trusted_Connection=Yes;" Dim cn As New OleDbConnection(strConn) Dim strSQL As String = "SELECT CustomerID, CompanyName FROM Customers" Dim cmd As New OleDbCommand(strSQL, cn) Dim da As New OleDbDataAdapter() da.SelectCommand = cmd
s
فى الكود السابق قمنا بانشاء مهئ البيانات من دون تمرير اى معاملات فى منشئ الفئة لذا قمنا باسناد كائن امر للخاصية
SelectCommand وهى تمثل الامر الذى يقوم على اساسه باسترجاع البيانات
Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _ "Initial Catalog=Northwind;Trusted_Connection=Yes;" Dim strSQL As String = "SELECT CustomerID, CompanyName FROM Customers" Dim da As New OleDbDataAdapter(strSQL, strConn)
فى الكود السابق قمنا بتمرير نص يمثل جملة sql التى سيقوم باسترجاع البيانات بناء عليها والمعامل الثانى هو نص الاتصال حيث يقوم مهئ البيانات بانشاء كائن اوامر ضمنيا عن طريقة يقوم بالاتصال
فى هذه الحاله اذا قمت بانشاء اكثر من مهئ بيانات فى البرنامج فانه سيقوم بانشاء اكثر من كائن اتصال ويمكن حل هذه المشكلة بانشاء كائن الاتصال اولا ونقوم بتمريره فى منشئ الفئة لمهئ البيانات
Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _
"Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
Dim daCustomers, daOrders As OleDbDataAdapter
daCustomers = New OleDbDataAdapter("SELECT ... FROM Customers", cn)
daOrders = New OleDbDataAdapter("SELECT ... FROM Orders", cn)يمكن ايضا تمرير كائن اوامر لمنشئ الفئة
Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _ "Initial Catalog=Northwind;Trusted_Connection=Yes;" Dim cn As New OleDbConnection(strConn) Dim strSQL As String = "SELECT CustomerID, CompanyName FROM Customers" Dim cmd As New OleDbCommand(strSQL, cn) Dim da As New OleDbDataAdapter(cmd)
استرجاع البيانات:
ويتم ذلك باستدعاء الطريقة Fill حيث يقوم مهئ البيانات بتنفيذ الاستعلام الموجود فى الخاصية SelectCommand وتخزين البيانات فى مجموعة بيانات DataSet
Dim strConn, strSQL As String strConn = "Provider=SQLOLEDB;Data Source=(local);" & _ "Initial Catalog=Northwind;Trusted_Connection=Yes;" strSQL = "SELECT CustomerID, CompanyName, ContactName, Phone " & _ "FROM Customers" Dim da As New OleDbDataAdapter(strSQL, strConn) Dim ds As New DataSet() da.Fill(ds)
الكود السابق يقوم بانشاء كائن جدول بيانات جديد داخل مجموعة البيانات هذا الجدول يحتوى على اعمده وهى الاعمدة التى تم جلبها من مصدر البيانات
تم اعادة تعريفها فهى يمكن ان تاخذ معاملات بالشكل التالىFillايضا الطريقة
DataAdapter.Fill(DataSet, "MyTableName")
فى الكود السابق يتم تحديد اسم كائن جدول بيانات DataTable
DataAdapter.Fill(DataTable) حيث يمكن اضافة البيانات الى كائن DataTable سبق انشاءه مباشرة
OleDbDataAdapter.Fill(DataSet, AdoRecordset, "TableName") OleDbDataAdapter.Fill(DataTable, AdoRecordset)
الكود السابق يقوم بنسخ البيانات من ADO Recordset الى ADO.NET DataSet فد تحتاج لهذه الطريقة لاسترجاع بيانات من عنصر او كود يستخدم تقنية ADO
فتح واغلاق الاتصال:
باستخدام كائن مهئ الاوامر وعند استعاء كل من الطريقة Fill,UPDate اذا كان الاتصال مغلق يقوم مهئ الاوامر بفتح الاتصال ضمنيا وتنفيذ الاستعلام واسترجاع النتائج وبعد ذلك يقوم باغلاق الاتصال اذا لا داعى لفتح الاتصال فى كل مرة تريد استدعاء Fill,UPDate فسيقوم مهئ الاوامر بذلك نيابة عنك ولكن فى بعض البرامج قد تحتاج لاستدعاء الطريقة Fill عدة مرات متتالية وليس من المنطقى ترك مهئ الاوامر يقوم بفتح وغلق الاتصال فى كل مرة الحل هو ان تقوم بفتح الاتصال واستدعاء Fill وبعد ذلك غلق الاتصال
Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _
"Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
Dim daCustomers, daOrders As OleDbDataAdapter
daCustomers = New OleDbDataAdapter("SELECT ... FROM Customers", cn)
daOrders = New OleDbDataAdapter("SELECT ... FROM Orders", cn)
Dim ds As New DataSet()
cn.Open()
daCustomers.Fill(ds)
daOrders.Fill(ds)
cn.Close()تنفيذ مجموعة استعلامات دفعة واحدة:
يمكن تنفيذ مجموعة من الاستعلامات دفعة واحدة(لابد ان تكون قاعدة البيانات تدعمها مثل sqlserver)
Dim strConn, strSQL As String
strConn = "Provider=SQLOLEDB;Data Source=(local);" & _
"Initial Catalog=Northwind;Trusted_Connection=Yes;"
strSQL = "SELECT CustomerID, CompanyName, ContactName, Phone " & _
"FROM Customers WHERE CustomerID = 'ALFKI'; " & _
"SELECT OrderID, CustomerID, EmployeeID, OrderDate " & _
"FROM Orders WHERE CustomerID = 'ALFKI'"
Dim da As New OleDbDataAdapter(strSQL, strConn)
da.TableMappings.Add("Table", "Customers")
da.TableMappings.Add("Table1", "Orders")
Dim ds As New DataSet()
da.Fill(ds)فى الكود السابق قمنا بتنفيذ جملتى sql مرة واحدة وهى تقوم باسترجاع البيانات من جدول الزبائن وجدول الطلبات عند استدعاء الطريقة fill يقوم مهى البيانات بانشاء كائنى جدول بيانات فى مجموعة البيانات كل واحد يحتفظ بنتائج جملة استعلام
جمل الاستعلام التى تحتوى على معاملات:
نقوم باضافة نوع وحجم المعامل عن طريق الخاصية SelectCommand التى تحتوى على مجموعة Parameters وبعد ذلك يمكن استخدام الطريقةGetFillParameters لمهئ البيانات لاعطاء قيمة للمعاملات
Dim strSQL As String = "SELECT CustomerID, CompanyName " & _
"FROM Customers WHERE CustomerID LIKE ?"
da = New OleDbDataAdapter(strSQL, strConn)
da.SelectCommand.Parameters.Append("@CustomerID", _
OleDbType.VarWChar, 5)
da.GetFillParameters(0).Value = "ALFKI"استرجاع البيانات من اجراء مخزن لمجموعة بيانات
اذا كان لديك اجراء مخزن stored procedure ويقوم باسترجاع مجموعة من النتائج فيمكن جلب هذه النتائج عن طريق مهئ البيانات الى مجموعة البيانات لنفترض انه لدينا الاجراء المخزن التالى:
CREATE PROCEDURE GetAllCustomers AS
SELECT CustomerID, CompanyName, ContactName, Phone FROM Customers
RETURN
ويمكن استدعاء الاجراء المخزن السابق بكتابة جملة استدعاء الاجراء المخزن بدلا من جملة sql كالتالى
{CALL GetAllCustomers}
او
EXEC GetAllCustomers
كما يمكنك اسناد كائن امر يقوم بتنفيذ اجراء مخزن لمهئ البيانات وسبق شرحه
وللموضوع بقيـــــة.......... :rolleyes:

