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

معلومة/ADO.NET

مغلق
بدأه SOLO.NET في 21 أكتوبر 2005 · 23 رد · 9,191 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

ADO.NET هى بيئة ميكروسوفت للتخاطب مع مخازن البيانات المختلفة ضمن اطار العمل .NET

واهم فئاتها تقع فى فضاءات الاسماء التالية:

•System.Data

•System.Data.Common

•System.Data.SqlClient

•System.Data.OleDbClient

•System.Data.SqlTypes

ADO.NETالشكل التالى يبين التركيب الهرمى لــ

21_10_05_11_10_28_1129918228untitled.JPG

يمكن التعامل مع قواعد البيانات بطريقتين وهما الطريقة المباشرة وتسمى الوضع المتصلCONNECTED MODE وبطريقة غير مباشرة وتسمى الوضع المنفصل DESCONNECTED MODE

وسنقوم هنا بشرح الطريقة الاولى وهى تستخدم فى حاله بناء التطبيقات المفرده اى عندما يكون للنظام مستخدم واحد وتوجد واجه المستخدم ومخزن قااعدة البيانات على نفس الجهاز.

ولنبدء بالتعرف على اهم الكائنات المستخدمة فى هذا الوضع

كائن الاتصالConnection Objects

عن طريق خصائص كائن الاتصال تستطيع تحديد مصدر البيانات والشروط الللا زمه لتحقيقه.  وبالطرقmethods يمكنك التحكم فى الاتصال وقطع الاتصال مع المصدر. كما يمكن منه انشاء كائن اوامرCommand وكائن تحويلTransaction

والان لنرى كيف يمكن انشاء كائن الاتصال والتعامل معه بالكود:

انشاء كائن الاتصال

Dim cn As OleDbConnection
cn = New OleDbConnection()

نص الاتصال وهو عبارة عن نص يمثل عدة معطيات الضرورية لانشاء اتصال وهو يختلف على حسب المزود

على سبيل المثال نوع مزود البياناتProvider,مصدر البياناتData Source ,اسم المستخدم وكلمة المرور... الخ

والصيغة العامه له هى:

strConn = "Setting1=Value1;Setting2=Value2;..."

وهذه بعض الامثله لنص الاتصال:

• الاتصال بقاعدة بيانات sql server

Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=MyDatabase;
    User ID=MyUID;Password=MyPassword;

واذا كان على الجهاز اكثر من نسخة من sql server  يجب ان تحدد النسخة التى تريد التعامل معها

Provider=SQLOLEDB;Data Source=MyServer\MyInstance;
    Initial Catalog=MyDatabase;User ID=MyUID;Password=MyPassword;

ايضا اذا كنت تعمل على شبكة وتعتمد على الامان فى الشبكة استخدم خاصيةIntegrated Security وشيل اسم المستخدم وكلمة السر

Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=MyDatabase;
    Integrated Security=SSPI;

;

• الاتصال بقاعد بيانات access

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Path\To\MyDatabase.MDB;

ويمكنك عدم تحديد  المسار الكامل لقاعدة البيانات وذلك بوضع ملق قاعدة البيانات فى مجلد bin  حيث سيقوم ado بالبحث فى هذا المجلد 
Provider=Microsoft.Jet.OLEDB.4.0;
    Data Source= MyDatabase.MDB;
اذا كانت قاعدة البيانات تحتوى على كلمة مرور
Provider=Microsoft.Jet.OLEDB.4.0;
    Data Source= Data\MyDatabase.MDB;
    Jet OLEDB:Database Password=MyPassword;

الان يمكنك اضافة نص الاتصال لكائن الاصال بطريقتين

عن طريق الخاصية ConnectionString

Dim strConn As String
strConn = "Provider=SQLOLEDB;Data Source=(local;" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As OleDbConnection
cn = New OleDbConnection()
cn.ConnectionString = strConn

عند انشاء الكائن فى منشئ الفئة

Dim strConn As String
strConn = "Provider=SQLOLEDB;Data Source=(local;" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As OleDbConnection
cn = New OleDbConnection(strConn

فتح واغلاق الاتصال

يتم فتح الاتصال باستدعاء الطريقةOpen()

ويتم الاغلاق باستدعاء الطريقة Close()

Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _
                        "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
cn.Open()
...
cn.Close()

احواض الاتصال Connection Pooling

فتح واغلاق الاتصال يكلف الكثير من مصادر النظام واذا كنت تعمل على مشروع متعدد الطبقات multi-tiered يمكنك استخدام احواض الاتصال لتحسين من كفاءة التطبيق والمحافظه على مصادر النظام

وحوض الاتصال يكون مفعل افتراضيا , لذلك عند اغلاق الاتصال فهو لا يتم اغلاقه فعليا ولكن يتم ترحيله الى حوض الاتصال لاعادة استخدامه

Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _
                        "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
Dim intCounter As Integer
For intCounter = 1 To 5
    cn.Open()
    cn.Close()
Next

الكود السابق يقوم بفتح واغلاق نفس الاتصال خمس مرات

كما قلنا ان حوض الاتصال يكون فعال افتراضيا فاذا كنت تريد ايقافه لسبب ما يتم ذللك باضافة الخاصية التالية لنص الاتصال OLE DB Services=-4;

وبالنسبة لمستخدمى كائن SqlConnection ضف هذه الخاصية لنص الاتصال Pooling=False;

استرجاع مخطط يمثل معلومات عن قاعدة بيانات

يتم ذلك بالطريقة GetOleDbSchemaTable ولهذه الطريقه باراميتران الاول عبارة عن احدى قيم المرقم OleDbSchemaGuid وبه تحدد نوع مخطط البيانات هل هو لللاعمده او الجدوال او اجراءات والبارميتر الثانى وهو يمثل قيود تحدد فى كيفية استرجاع البيانات يعمل كفلتر فعن طريقه مثلا يمكن تحديد الاعمدة المراد جلبها من جدول محدد وهو يكون على هيئة مصفوفة من القيم ويمكن الاستغناء عن البارميتر الثانى بارسال القيمة nothing

الكود التالى يقوم بجلب كل المعلومات عن الاعمدة فى كل الجداول

Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _
                        "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
cn.Open()
Dim tbl As DataTable

tbl = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)


الكود التالى يقوم باسترجاع الاعمده من جدول Customers
Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _
                        "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
cn.Open()
Dim objRestrictions As Object()
objRestrictions = New Object() {Nothing, Nothing, "Customers", Nothing}
Dim tbl As DataTable
tbl = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, objRestrictions

خاصية الحاله State Property

وهى تعود باحدى قيم المرقم ConnectionState وهذه القيم هى

• Broken ويحدث عندما يكون قد تم فتح الاتصال ولكن غير قادر على الاتصال بسبب عطل فى الشبكة او مشكله فى السيرفر مثلا

• Closed اى ان الاتصال مغلق

• Open اى ان اتصال مفتوح

• Connicting جارى الاتصال

• Executing الاتصال يقوم بتنفيذ استعلام

• Fetching الاتصال مشغول فى جلب بيانات

If cn.State = ConnectionState.Closed Then
'Do something here
EndIf

تم تعديل هذه المشاركة بواسطة SOLO.NET في 21 أكتوبر 2005 في 21:52

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#2

يا سلام عليك يا أخ عبد الخالق انت باين عليك بتقرا أفكاري , والله كنت ناوي أعمل موضوع يتناول الـ ADO.NET بالأمثله , فجزاك الله خيرا :rolleyes:

#3

كائن الاوامر Command Objects

يستخدم كائن الاوامر فى تنفيذ انواع مختلفة من جمل الاستعلام كتحديث مصدر بيانات او استرجاع بيانات من مخزن بيانات ايضا فى تحديث هيكلية مخزن بيانات

والان لنرى كيف يمكن انشاء كائن الاتصال والتعامل معه بالكود:

انشاء كائن اوامر

ويمكن القيام بذللك بثلاث طرق مختلفة

Dim strConn, strSQL As String
strConn = "Provider=SQLOLEDB;Data Source=(local);" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes;"
strSQL = "SELECT CustomerID, CompanyName FROM Customers"
Dim cn As New OleDbConnection(strConn)
cn.Open()
Dim cmd As OleDbCommand
الطريقة الاولى نقوم باتشائه باستدعاء الطريقة CreateCommand لكائن الاتصال
cmd = cn.CreateCommand()
cmd.CommandText = strSQL
الطريقة الثانية وهى باستخدام الكلمة المحجوزه new  وبعد ذلك نستطيع اسناد الخصائص له
cmd = New OleDbCommand()
cmd.CommandText = strSQL
cmd.Connection = cn
الطريقة الثالثة وهى بارسال نص الاستعلام وكائن الاتصال فى منشئ الفئة
cmd = New OleDbCommand(strSQL, cn)

تنفيذ جمل استعلام الاداء

وهى جمل الاستعلام التى تنفذ على مخزن بيانات ولا تعود باى صف اى لا تعود بنتيجه ويوجد نوعان من جمل استعلامات الاداء النوع الاول ويسمى لغة معالجة البيانات Data manipulation language (DML) وههذه اللغة هى المسؤله عن تحديث محتويات قاعدة البيانات(تحديث محتويات الجداول) مثل الاضافة والحذف والتعديل

وهذه امثلة عليها

UPDATE Customers SET CompanyName = 'NewCompanyName'
       WHERE CustomerID = 'ALFKI'

INSERT INTO Customers (CustomerID, CompanyName)
       VALUES ('NewID', 'NewCustomer')

DELETE FROM Customers WHERE CustomerID = 'ALFKI'

النوع الثانى ويسمى لغة توصيف البيانات Data definition language (DDL) queries وهى مسؤلة عن تعديل فى مخطط قاعدة البيانات وتركيبتها وهى غير مستخدمة بكثرة

وهذه امثلة عليها

CREATE TABLE Table1 (Field1 int NOT NULL 
                     CONSTRAINT PK_Table1 PRIMARY KEY, 
                     Field2 varchar(32))

ALTER VIEW View1 AS SELECT Field1, Field2 FROM Table1

DROP PROCEDURE StoredProcedure1

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

Dim cn As New OleDbConnection()
cn.ConnectionString = "Provider=SQLOLEDB;Data Source=(local);" & _
                      "Initial Catalog=Northwind;Trusted_Connection=Yes;"
cn.Open()
Dim cmd As OleDbCommand = cn.CreateCommand()
cmd.CommandText = "UPDATE Customers SET CompanyName = 'NewCompanyName'" & _
                  " WHERE CustomerID = 'ALFKI'"
cmd.ExecuteNonQuery()

ولا تنسى دائما وابدا ان تقوم باغلاق الاتصال

ولا تنسى ايضا ان تقوم بمعالجة الاستثناءات او الاخطاء التى تحدث وذلك بوضع الكود بين فكى العبارة

Try

Catch

Finally

End Try

فالعديد من الاخطاء يمكن ان تحدث والاستثناءات هنا سستكون من النوع

OleDb.OleDbException

تنفيذ استعلامات التحديد

وهى الجمل التى تعودبصف او مجموعة صفوف واحيانا لا شئ (الاستفسار)

وطبعا لقراءة الناتج من هذا الاستعلام نحن بحاجة الى كائن اخر يقوم بعرض هذه البيانات و هنا هو الكائن

DataReader

هذا الكائن يستخدم للقراءة فقط وفى اتجاه واحد يكون لللامام فقط

والان لنرى كيف يمكن انشاء كائن قارئ البيانات والتعامل معه بالكود:

انشاء الكائن:

ويتم ذلك باستدعاء الطريقة Execute¬Reader لكائن الاوامر

Dim strConn, strSQL As String
strConn = "Provider=SQLOLEDB;Data Source=(local);" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
cn.Open()
strSQL = "SELECT CustomerID, CompanyName FROM Customers"
Dim cmd As New OleDbCommand(strSQL, cn)
Dim rdr As OleDbDataReader = cmd.ExecuteReader()
While rdr.Read()
    Console.WriteLine(rdr("CustomerID") & " – " & rdr("CompanyName"))
End While
rdr.Close()

ولاحظ انه لا يتم قراءة الصف الاول من النتائج بمجرد استدعاء الطريقة cmd.ExecuteReader

فلابد من استدعاء الطريقة read التى توجه قارئ البيانات الى الصف الاول من النتائج

يتجه قارئ البيانات الى الصف الاول من النتائج وهذه الطريقة تعود بقيمة readعند استدعاء الطريقة

فهذا يعنى انه يوجد صف لقراءته ويتم قراءة قيم Trueمنطقية فاذا كانت

الاعمده عن طريق الخاصية item حيث نعطيها اسم العمود

وبالامكان التحسين من اداء الكائن فى قراءة البيانات بطريقتين

الاولى وذلك باعطاء الخاصية item ترتيب العمود كما فى الجدول حيث العمود الاول يحمل القيمة صفر وهكذا

قد تجد هذه الطريقة صعبة لانه من الصعب حفظ ترتيب الاعمده على غرار اسمائهن ولكن قارئ البيانات يسهل المهمه فلديه الطريقة GetOrdinal التى تعود برقم يمثل ترتيب العمود

...
Dim rdr As OleDbDataReader = cmd.ExecuteReader()
Dim intCustomerIDOrdinal As Integer = rdr.GetOrdinal("CustomerID")
Dim intCompanyNameOrdinal As Integer = rdr.GetOrdinal("CompanyName")
While rdr.Read()
    Console.WriteLine(rdr(intCustomerIDOrdinal) & " – " & _
                      rdr(intCompanyNameOrdinal))
End While
rdr.Close()

الطريقة الثانية لتحسين الاداء فى قراءة البيانات بتحديد نوع البيانات حيث ان item كانت تعود بكائن من النوع object

لقارئ البيانات سلسلة من الطرق Getxxx حيث xxx هنا هى نوع محدد من البيانات كstring او int32 مثلا

...

Dim rdr As OleDbDataReader = cmd.ExecuteReader()
Dim intCustomerIDOrdinal As Integer = rdr.GetOrdinal("CustomerID")
Dim intCompanyNameOrdinal As Integer = rdr.GetOrdinal("CompanyName")
While rdr.Read()
    Console.WriteLine(rdr.GetString(intCustomerIDOrdinal) & " – " & _
                      rdr.GetString(intCompanyNameOrdinal))
End While
rdr.Close()

استجلاب نتائج متعدده دفعة واحدة

بعض قواعد البيانات ك sqlserver يسمح بتنفيذ عدة استعلامات دفعة واحده التى تعود بنتائج متعددة(غير مدعومه فى access) فمثلا لو اردنا تنفيذ جمل الاستعلام التالية:

SELECT CustomerID, CompanyName, ContactName, Phone FROM Customers;
SELECT OrderID, CustomerID, EmployeeID, OrderDate FROM Orders;
SELECT OrderID, ProductID, Quantity, UnitPrice FROM [Order Details]

فى المثال السابق قمنا باستخدام الطريقة read فى حلقة تستمر حتى تعود الداله بقيمة false ولكن لو قمنا باستخدامها مع مجموعة من الاستعلامات فستتم قراءة بيانات الاستعلام الاول فقط لذلك توجد الطريقة NextResult وهى شبيهه بـread حيث تنتقل لصف التالى اذا كانت القيمة العائدة هى true

...
cn.Open()
Dim strSQL As String
strSQL = "SELECT CustomerID, CompanyName FROM Customers;" & _
         "SELECT OrderID, CustomerID FROM Orders;" & _
         "SELECT OrderID, ProductID FROM [Order Details]"
Dim cmd As New OleDbCommand(strSQL, cn)
Dim rdr As OleDbDataReader = cmd.ExecuteReader()
Do
    Do While rdr.Read()
        Console.WriteLine(rdr(0) & " – " & rdr(1))
    Loop
    Console.WriteLine()
Loop While rdr.NextResult()

تنفيذ جمل الاستعلام التى تعود بقيمة واحدة

فى بعض جمل الاستعلا نحتاج الى قيمة واحدة من صف واحد وعمود واحد على سبيل المثال عدد الزبائنوهذا مثال لجمله استعلام تعود بقيمة واحدة:

SELECT COUNT(*) FROM Customers
SELECT CompanyName FROM Customers WHERE CustomerID = 'ALFKI'

استخدام قارئ البيانات او مجموعة البيانات هو تفريط فى مصادر النظام لكائن الاوامر الطريقة ExecuteScalar التى صممت خصيصا لهذا النوع من الاستعلامات وهى تعود بنوع عام من البيانات object قم بتحويله على حسب البيانات التى تقوم بالاستعلام عنها لتحسين الاداء

Dim strConn As String = "Provider=SQLOLEDB;Data Source=(local);" & _
                        "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
cn.Open()
Dim cmd As OleDbCommand = cn.CreateCommand()

cmd.CommandText = "SELECT COUNT(*) FROM Customers"
Dim intCustomers As Integer = CInt(cmd.ExecuteScalar())

cmd.CommandText = "SELECT CompanyName FROM Customers " & _
                  "WHERE CustomerID = 'ALFKI'"
Dim strCompanyName As String = Convert.ToString(cmd.ExecuteScalar)

تنفيذ جمل الاستعلام التى تحتوى على وسيطات

فى جمل الاستعلام السابقة كنا نحدد معرف الزبون CustomerID ولكن ماذا اذا اردنا ان يتم تحديد معرف الزبون من قبل المستخدم وهذا ما يحصل دائما فلن نقوم بكتابة جملة استعلام لكل زبون ولكن سنقوم بعمل استعلام يقبل وسائطparameters تحدد بها معرف الزبون :

SELECT OrderID, CustomerID, EmployeeID, OrderDate
       FROM Orders WHERE CustomerID = ?
علامه الاستفهام تمثل علامة للوسيطه
Dim strConn, strSQL As String
strConn = "Provider=SQLOLEDB;Data Source=(local);" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes;"
Dim cn As New OleDbConnection(strConn)
cn.Open()
strSQL = "SELECT OrderID, CustomerID, EmployeeID, OrderDate " & _
         "FROM Orders WHERE CustomerID = ?"
Dim cmd As New OleDbCommand(strSQL, cn)
'اضافة بارميتر
cmd.Parameters.Add("@CustomerID", OleDbType.WChar, 5)
'اعطاء قيمة له
cmd.Parameters(0).Value = "ALFKI"
Dim rdr As OleDbDataReader = cmd.ExecuteReader()

استدعاء الاجراءات المخزنة

لنفترض انه لدينا اجراء مخزنStored Procedure الذى يعود بصف من البيانات وهذا مثال على اجراء مخزن يقوم بنفس الوظيفة

CREATE PROCEDURE GetCustomer (@CustomerID nchar(5)) AS
    SELECT CustomerID, CompanyName, ContactName, ContactTitle
           FROM Customers WHERE CustomerID = @CustomerID
RETURN

كيف سنقوم بتنفيذ الاجراء السابق من خلال كائن الاوامر,؟ كائن الاوامر لديه الخاصية CommandType التى تاخذ احدى قيم المرقمCommandType وهى Text, TableDirect,StoredProcedure وهى فى الوضع الافتراضى تكون text ,اسناد القيمة StoredProcedure تخبر كائن الاوامر اننا نريد استدعاء اجراء مخزن من قاعدة البيانات حيث سيقوم بجمع القيمة المخزنه فى الخاصية CommandTextونضع فيها اسم الاجراء مع معلومات مجموعة الوسيطات لينشئ جمله يستدعى بها الاجراء المحدد

...
Dim cn As New OleDbConnection(strConn)
cn.Open()

Dim cmd As OleDbCommand = cn.CreateCommand()
With cmd
    .CommandText = "GetCustomer"
    .CommandType = CommandType.StoredProcedure
    .Parameters.Add("@CustomerID", OleDbType.WChar, 5)
    .Parameters(0).Value = "ALFKI"
End With

Dim rdr As OleDbDataReader = cmd.ExecuteReader()
If rdr.Read() Then
    Console.WriteLine(rdr("CompanyName"))
Else
    Console.WriteLine("No customer found")
End If

rdr.Close()
cn.Close()
طريقة اخرى لاستدعاء الاجراءات المخزنه
Dim cmd As New OleDbCommand()
cmd.CommandText = "{CALL GetCustomer(?)}"
cmd.CommandType = CommandType.Text

إسترجاع البيانات من بارامترات المخرجات

لنفترض انه لدينا الاجراء المخزن التالى

CREATE PROCEDURE GetCustomer (@CustomerID nchar(5),

@CompanyName nvarchar(40) OUTPUT,

@ContactName nvarchar(30) OUTPUT,

@ContactTitle nvarchar(30) OUTPUT) AS

SELECT @CompanyName = CompanyName, @ContactName = ContactName,

@ContactTitle = ContactTitle

FROM Customers WHERE CustomerID = @CustomerID

IF @@ROWCOUNT = 1

RETURN 0

ELSE

RETURN -1

كيف يمكننا استخدام كائن الاوامر لاسترجاع استرجاع البيانات من الـ output parameters؟

الكائن Parameter لديه الخاصية تسمى Direction وهى تاخذ احدى قيم المرقم ParameterDirection: ReturnValue, Input, InputOutput, and Output القيمة الافتراضية هى Input وسنغير هذه القيمة الى Output

الاجراء السابق يعود بقيمة تمثل نجاح او الفشل فى العثور على الزبون المحدد ومن خلال الكود سنرى كيف سنختبر القيمة لتحديد هل تم العثور على الزبون ام لا

...
Dim cn As New OleDbConnection(strConn)
cn.Open()

Dim cmd As OleDbCommand = cn.CreateCommand()
With cmd
    .CommandText = "{? = CALL GetCustomer(?, ?, ?, ?)}"

    .Parameters.Add("@RetVal", OleDbType.Integer)
    .Parameters.Add("@CustomerID", OleDbType.WChar, 5)
    .Parameters.Add("@CompanyName", OleDbType.VarWChar, 40)
    .Parameters.Add("@ContactName", OleDbType.VarWChar, 30)
    .Parameters.Add("@ContactTitle", OleDbType.VarWChar, 30)

    .Parameters("@ContactTitle").Direction = ParameterDirection.Output
    .Parameters("@RetVal").Direction = ParameterDirection.ReturnValue
    .Parameters("@CustomerID").Value = "ALFKI"
    .Parameters("@CompanyName").Direction = ParameterDirection.Output
    .Parameters("@ContactName").Direction = ParameterDirection.Output

    .ExecuteNonQuery()
    If Convert.ToInt32(.Parameters("@RetVal").Value) = 0 Then
        Console.WriteLine(.Parameters("@CompanyName").Value)
    Else
        Console.WriteLine("Customer not found")
    End If
End With

التعامل مع التنقلات Transaction

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

لكائن الاوامر الخاصية Transaction حيث نقوم باسناد كائن التنقل اليها ويتم انشاء الكائن باستدعاء الطريقة BeginTransaction() لكائن الاتصال

يتم استخدام احدى الطريقتين Commit او Rollback الاولى للموافقة ويتم حفظ نتائج الاستعلام والثانية للتراجع فى حاله عدم تحقق شرط معين او حدوث خطاء

...
cn.Open()
Dim txn As OleDbTransaction = cn.BeginTransaction()
Dim strSQL As String = "INSERT INTO Customers (...) VALUES (...)"
Dim cmd As New OleDbCommand(strSQL, cn, txn)
Dim intRecordsAffected As Integer = cmd.ExecuteNonQuery()
If intRecordsAffected = 1 Then
    Console.WriteLine("Update succeeded")
    txn.Commit()
Else
    'Assume intRecordsAffected = 0
    Console.WriteLine("Update failed")
    txn.Rollback()
End If

وفى الختام ارجو ان اكون وفقت فى ايصال معلومة ولو بسيطة وما توفيقى الا بالله

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#4
اقتباس
يا سلام عليك يا أخ عبد الخالق انت باين عليك بتقرا أفكاري , والله كنت ناوي أعمل موضوع يتناول الـ ADO.NET بالأمثله , فجزاك الله خيرا 

شكرا لك اخى حزووم والقلوب عند بعضها السبب اللى خلانى احط الدرس هذا هو كثرة الاسئله فى الفترة الاخيرة وحبيت الاجابة ولو بشكل بسيط والموضوع اكبر من هذا وهو مفتوح للمناقشة والاضافة والتعديل وممكن حذف كمان :lol:

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#5

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

اكمل الدروس اخي الكريم

كذلك لي تساؤل !!!

لماذا شرحت ال ado.net في وضع الاتصال؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

قراءة ان يعتبر افضل ميزة و ان ال ado.net يمكن التعامل مع قواعد البيانات في وضع الانفصال (عدم الاتصال) وان ال ADO لا يمكن ان تنافس ال ADO.net في هذا المجال؟

كذلك ما اهمية التعامل مع قواعد البياناتت في وضع الاتصال؟

ما هي التطبيقات الي يفضل استخدام خاصية الاتصال مع قواعد البيانات من خلال الـ ado.net؟

جزيت عنا خيرا خي

#6

لو يسمح الأخ solo أرد علي الأخ Wise :

التعامل بالـ ADO.NET في الوضع المتصل أسرع لأنه في الوضع المنفصل تضطر الي استخدام الـ Dataset وهو يستهلك الذاكره , كما أن التعامل في الوضع المتصل يعتبر أسهل ,,,

#7
hazzoom كتب:
لو يسمح الأخ solo أرد علي الأخ Wise :

التعامل بالـ ADO.NET في الوضع المتصل أسرع لأنه في الوضع المنفصل تضطر الي استخدام الـ Dataset وهو يستهلك الذاكره , كما أن التعامل في الوضع المتصل يعتبر أسهل ,,,

اخي الكريم hazzoom

اولا:اول شئ قرأته عن ال ado.net انخاصية التعامل مع قواعد البيانات في وضع عدم الاتصال (الانفصال)

وهذه الميزة ليست موجودة في ال ado بالفيجوال بيسك 6

ثانيا: ان في حالة الاتصال بقاعدة البيانات فأنها تستهلك الكثير من مصارد النظام

فيكف تقول قولتك اخي الكريم؟

ارجو التعقيب من الاخوة المحترفين

#8

يا عم الحاج Wise عندما تستخدم الـ Dataset فانك تقوم بعمل نسخة من الجداول التي تعمل عليها الي الـ Dataset في الذاكره , أوليس هذا استهلاك للذاكره ولا أنا غلطان !!!!!!!!!!!!!!!!!

#9

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

درس رائع

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#10

لا اخي انت مش غلطان خالص

بس اكيد في طريقة تحل هذا المشكلة و ربما استخدام مفات (xml) انا مش عارف الكتير عن النقطة ده

بس قرأت ان من مميزات التعامل مع قواعد البيانات استخدام ال dataset و التي هي ثورة في عالم برمجة قواعد البيانات و الله اعلم

و الا بقى مفيش فرق من التعامل من ال ado و ال ado.net

انا عمال اتعلم ال ado.net و في الاخر استخدم نفس الطريقة في التعامل مع قواعد البيانات (طريقة الاتصال)؟؟؟

الافضل في هذه الحالة ان ارجع للتعامل مع ال ado على الاقل اني انجزت فيها من الكثير

ارجو الافادة و سوؤال اهل الخبرة

تحياتي

#11
اقتباس
جزاك الله خيرا اخي الكريم

اكمل الدروس اخي الكريم

كذلك لي تساؤل !!!

لماذا شرحت ال ado.net في وضع الاتصال؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

قراءة ان يعتبر افضل ميزة و ان ال ado.net يمكن التعامل مع قواعد البيانات في وضع الانفصال (عدم الاتصال) وان ال ADO لا يمكن ان تنافس ال ADO.net في هذا المجال؟

كذلك ما اهمية التعامل مع قواعد البياناتت في وضع الاتصال؟

ما هي التطبيقات الي يفضل استخدام خاصية الاتصال مع قواعد البيانات من خلال الـ ado.net؟

اعتقد انى اجبت جزء من السؤال فى بداية الدرس

اقتباس
وسنقوم هنا بشرح الطريقة الاولى وهى تستخدم فى حاله بناء التطبيقات المفرده اى عندما يكون للنظام مستخدم واحد وتوجد واجه المستخدم ومخزن قااعدة البيانات على نفس الجهاز.
اقتباس
لو يسمح الأخ solo أرد علي الأخ Wise :

التعامل بالـ ADO.NET في الوضع المتصل أسرع لأنه في الوضع المنفصل تضطر الي استخدام الـ Dataset وهو يستهلك الذاكره , كما أن التعامل في الوضع المتصل يعتبر أسهل ,,,

كلام سليم يعنى لا بد لنا ان نحدد متى نستخدم اى طريقة للوصول والتعامل مع مخازن البيانات  وما يحدد ذلك هو طبيعة التطبيق الذى نعمل عليه

اقتباس
اخي الكريم hazzoom

اولا:اول شئ قرأته عن ال ado.net انخاصية التعامل مع قواعد البيانات في وضع عدم الاتصال (الانفصال)

وهذه الميزة ليست موجودة في ال ado بالفيجوال بيسك 6

ثانيا: ان في حالة الاتصال بقاعدة البيانات فأنها تستهلك الكثير من مصارد النظام

فيكف تقول قولتك اخي الكريم؟

ارجو التعقيب من الاخوة المحترفين

نعم هذه ميزه ado.net ولكن هذا لا يعنى ان استخدامها اجبارى وافضل من الوضع المتصل فلكل تقنية واسلوب مكان يستخدم فيه

اما النقطة الثانية فتحدث عند العمل على شبكة ويكون يستخدم النظام عشرات المستخدمين

اقتباس
انا عمال اتعلم ال ado.net و في الاخر استخدم نفس الطريقة في التعامل مع قواعد البيانات (طريقة الاتصال)؟؟؟

الافضل في هذه الحالة ان ارجع للتعامل مع ال ado على الاقل اني انجزت فيها من الكثير

يا اخى عندما تبرمج بالدوت نت فانت تستخدم ado.net فتقنية ado القديمة غير مدعومه بارغم من انه يمكنك استخدامها واذا كنت مصر على استخدامها فخليك مع vb6

وبما انك تتعلم ado.net ايضا لابد ان تتعلم جميع طرق البرمجة فيها

لانك فى تطبيقاتك قد تستخدم خليط من كائنات ado.net فقد تستخدم datareader وdataset فى تطبيق واحد وذلك على حسب المهمة التى ستقوم فيها بعد جلب البيانات,

تم تعديل هذه المشاركة بواسطة SOLO.NET في 22 أكتوبر 2005 في 21:17

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#12

شكرا اخي الكريم SOlO.net

ارجو من اخباري بمتي نستخدم ال ado.net في حالة الاتصال و كذلك في حالة عدم الاتصال بشئ من التفصيل

ما افضل التبطيبقات لكل من الطريقتين ؟؟؟

#13

مداخلة: أرجوا أن تكون مفيدة

ماهي البيئة المتصلة؟

مقدمة: في تاريخ الحاسبات البيئة المتصلة كانت هي البيئة الوحيدة السائدة.

تعريف البيئة المتصلة: هي البيئة التي يكون فيها مستخدم أو تطبيق متصلان بشكل مستمر بمصدر البيانات.

إيجابيات السيناريو المتصل:

بيئة آمنة وأسهل صيانة

التحكم بسهولة في مزامنة البيانات.

البيانات أكثر حداثة من السيناريوهات الأخرى.

سلبيات السيناريو المتصل:

يجب توفر اتصال ثابت ومستمر بالشبكة.

أمثلة تستخدم فيها البيئة المتصلة:

مصنع يتطلب اتصال فوري ومباشر لمراقبة الإنتاج والمخزون.

ماهي البيئة المنفصلة أو الغير متصلة؟

المقدمة: مع وجود الإنترنت سيناريوهات العمل المنفصل أصبحت هي الشائعة. ومع الاستخدام المتزايد للأدوات والأجهزة المحمولة باليد السيناريوهات المنفصلة تصبح عالمية تقريباً. الجهاز المحمول وأي حاسبات نقالة أخرى تتيح لك استخدام التطبيقات بينما تكون غير متصل بخادمات أو قواعد البيانات.

في حالات كثيرة لايتم العمل في بيئة متصلة أو منفصلة بشكل كلي بل يكون في بيئة تدمج وتمزج بين البيئتين.

تعريف البيئة المنفصلة: هي البيئة التي يكون فيها مستخدم أو تطبيق غير متصلان بشكل مستمر بمصدر البيانات.

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

إيجابيات البيئة الغير متصلة

يمكنك العمل مع البيانات في الوقت والظرف المناسب لك ثم يمكنك الاتصال بمصدر البيانات في وقت لاحق لمعالجة الطلبات.

يمكن للمستخدمون الآخرون استخدام الاتصال.

تحسن الأداء.

سلبيات البيئة الغير متصلة

البيانات ليست حديثة بشكل مستمر.

التعارضات نتيجة تغير البيانات يمكن أن تحدث ويجب حلها.

إن أول سيناريو صمم ADO.NET ليعطي الأداء الأمثل فيه هو مجموعات النتائج غير المتصلة. وبالتالي فمجموعة البيانات هي بالضرورة غير متصلة.

أما السيناريو الثاني الذي صمم ADO.NET ليعطي الأداء الأمثل فيه، فهو عندما نريد المرور على سجلات مجموعة نتائج سجل سجل. وفي هذه الحالة لايمكن القيام بأي تغييرات على البيانات. فقط يمكنك المرور من أول المجموعة إلى أخرها.

والمشكلة في ADO.NET تكمن عندما نريد العمل مع البيانات بطريقة غير قياسية مثلاً: أن نحصل على مجموعة نتائج متصلة بمصدر البيانات، وقابلة لأن نتنقل خلالها بكل الاتجاهات، وقابله للتعديل أيضاً وهذا مالا يمكن عمله من خلال ADO.NET.

ينبغي أن نتذكر أن إطار عمل .NET بكامله قد صمم لغاية وحيدة، هي دعم العمل عبر الإنترنت، وخاصة تنفيذ الوظائف عن طريق خدمات Web. قد يؤثر ترك الاتصال بقاعدة البيانات مفتوحاً تأثيراً جدياً على حسن أداء التطبيقات، وقد سعي في تصميم.NET إلى منع ذلك. وإن كنت بالفعل بحاجة إلى استخدام هذه الوظيفة، فعليك بـ ADO.

عموماً مازال بالإمكان تعديل مصدر البيانات من خلال ADO.، وذلك بتنفيذ الأوامر باستخدام الصنف Command. ولعل التقنية الأكثر فاعلية للحصول على ولوج متصل، هي المزاوجة بين الأوامر(Commands) وقارىء البيانات(DataReader).

وتقبلوا تحياتي.

تم تعديل هذه المشاركة بواسطة المزيني في 22 أكتوبر 2005 في 23:30

#15
اقتباس
شكرا اخي المزيني

لكن مالزلت لم تجب على سؤالي

حتى الان لم تحصل على اجابة؟؟؟؟؟ :(

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#16
SOLO.NET كتب:
حتى الان لم تحصل على اجابة؟؟؟؟؟ :(

يعني مش متأكد

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

اي انه لا مجال استخخدام برمجة ado.net في عدم الاتصال مع هذه النوعية علي الاطلاق؟

و بالتالي وضع عدم الاتصال فقط هي افضل في حالة تطبيقات الشبكات (او تطبيقات الويب)فقط؟

كذلك اليس خصية xml هي الحل لمشكلة استخدام ال dataset و التي تعمل على التحميل على الذاكرة

عن طريق تفريغ ما بمجموعة البيانات (dataset) في xml

ارجو التوضيح ان امكن و تصحيح المعلومات

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

#17

أخي الكريم ، أخواني الأعزاء ،،،

آسف على المداخلة البسيطة هذه ولكني سوف أقول لك ما عندي وما أعلمه ، " مع التوضيح على أن معلوماتي بسيطة في هذا المجال " .

إستخدام XML وإستخدام ADO.NET يسهل التالي:

أما تلاحظ أنه عندما تنشيء DataSet جديده وتقوم بالتعامل معها يقوم هو تلقائياً بإنشاء مخطط XML الخاص ببنية الجداول في قاعدة البيانات وشروط العمليات عليها تلقائياً بحيث يتم جلبها من قاعدة البيانات وحفظها في ملف مع نفس المشروع بنفس إسم الـDataSet .

وهل لا حظت أنه عند بنائك لـ Dataset يمكنك من عمل Relations والـ Constraints بين الجداول تلقائياً في بيئة الـ XML نفسها بحيث تسهل عليك معرفة هيكلة الجداول بقاعدة البيانات بدون الرجوع إليها .

لذا أنا أسألك سؤال مالذي يتغير في البيئة المتصلة البيانات أم تركيبة قاعدة البيانات ؟!!

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

أي أن هذه الخصائص لن تتغير على مستوى قاعدة البيانات ، وإذا تم تغييرها يجب الرجوع هنا والتعديل على نفس النموذج وبالتالي يتم إعادة بناء الـ XML الذي يعرف هيكلة قواعد البيانات لنفس الـ DATASET .

البيئة المتصلة والمنفصلة الذي تحدث عنها الأخ سول.نت هي في

إمكانية تحميل البيانات إلى الذاكرة عند العمل مع البيانات "البيئة المنفصلة " ، أي أنها منفصلة عن المصدر قاعدة البيانات .

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

التعامل مع البيانات في البيئة المتصلة .

-- هي المفضلة قطعاً ولكنك ذكرت أنها تحمل عبئاً على موارد النظام ، أنا لا أشاركك في هذا لأنه من مهام قواعد البيانات الأساسية ومن خصائصها ومميزاتها هو تخفيف هذا العبء بتسهيل التعامل مع قواعد البيانات وتخفيف العبء ، يعني مثلاً لو إستخدمت قوعد بيانات أوراكل مثلاً بنيتها تسمح لك بإجراء ملا يين الملايين من العمليات في الثانية الواحدة دون تشكيل أي عبء على النظام طبعاً أنا أقصد العمليات العادية .

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

ويقوم هنا العميل فقط بعمل عملية بسيطة كتحديث أو إضافة أو حذف .

ومن ثم لعرض النتائج قم بإستخدام التقارير " جملة SELECT " عادية وبسيطة .

هذا وأسأل العلي القدير

أني قد نفعت وانتفعت ،، وأخشى أن لا يكون حديثي في غير الموضوع ...

وبالتوفيق ،،

إبراهيم بخش - المدينة المنورة . :blink: :) :wacko: -waf

#18

هذا أجتهادي في هذا الموضوع ومن إجتهد فلم يصب فله أجر ومن أجتهد وأصاب فله أجران .

أسأل الله العلي القدير ان أكون قد أصبت .

ثم ..... أطلب من الخبراء تصحيح معلوماتي إذا كنت مخطئاً و الثناء مع البهارات عليها إذا أصبت .

#19

مشكور اخوي على الشرح الوافي ;)

إحدى المتع الرائعة في الحياة... هي أن تحقق مايقول الناس إنك لاتستطيع تحقيقة ...

#20

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

بارك الله فيك على المجهود الطيب

ولكن حاول ان تستخدم المعالج السحري فالموضوع يصبح اسهل وابسط

شكرا على المعلومات القيمة

م ش سكيك

#21

مساء الخير :::...

شكرا لك يا اخي علي الطريقة والكود

#22

شكرا على الشرح الوافي للموضوع

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

واطرح منها قيمه يدخلها المستخدم فكيف يكون ذلك؟؟؟؟؟؟

#23

انا اتوقع اننا لو نقلنا الحوار عن أوضاع معينه للبرامج نصوت عليها

يعني فرضا انا اتوقع لو كان البرنامج ذو مستخدم واحد وعملت اتصال متصل او منفصل ماراح تفرق كتير

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

طيب لو كانت قاعدة البيانات على الانترنت

طيب لو كنت تتكلم عن موقع انترنت

ارجو من الأخوة وضع النقط على الحروف بوضع الأمثلة

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

انا اقلكم خبرة واسف للمداخلة

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

#24

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

أولاً شكراً جزيلاً لكل من شارك في هذا الموضوع الأكثر من شيق وأخص أخي SOLO الذي نفتخر دوماً بأنة المشرف على القسم الذي طالما أحببناه كثيراً , ولكنني لا أريد أن أطيل عليكم ..

إخواني الأعضاء جميعاً أنا كنت سابقاً من مبرمجي VB.Net2003 وقد إنتقلت إلى VB.Net2005 سريعاً عندما قرأت ورأيت الكثير عن الإصدار الجديد ( 2005 ) . وما أدهشني أكثر هو التغير الكبير في ADO.NET2005 فلقد تغير بشكل كبير جداً وبصراحة تواجهني حتى الأن مشاكل وتساؤلات كثيرة عن ADO.NET2005 وخاصة في ما يتعلق بالـ DataSet و DataAdapter .

فهل يمكن فتح نقاش جاد عن هذا الموضوع الممتع لنغوص في أعماقة ونكتشف مابة أو هل يمكن إعطائي رابط لكتاب يتحدث عن هذا الموضوع .

أرجو إعطاء هذا الموضوع حقه ومشكككككككككككككككككورين

هذا الموضوع مغلق.

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