14-10-12, 09:14 PM
Asynchronous Data Access :
في هذه الجزئية سنحاول تعلم طريقة تمنعنا من عمل عدة عمليات على قواعد البيانات في نفس الوقت لمنع التضارب ، ومع ان المشكلة ستواجهنا بصورة اكبر في الوضع المنفصل Disconnected والذي هو موضوع درسنا القادم ، إلا اننا سنجرب الحل في هذه العجالة السريعة ، جرب المثال التالي :
C#:
vb.net:
أول خطوة قمنا بها هي تعريف الوضع Asynchronous Processing=true في ال ConnectioString بهذه الطريقة اصبحنا قادرين على الاستفادة من الدوال التالية :
BeginExecuteReader() و EndExecuteReader()
BeginExecuteNonQuery() و EndExecuteNonQuery()
BeginExecuteXmlReader() وEndExecuteXmlReader()
سنجرب الآن على BeginExecuteReader و EndExecuteReader ، وسنبدأ بتأخير جملة الاستعلام الأولى لخمس ثوان مثلاً :
c#:
vb.net:
هنا سنقوم بتنفيذ عمليات أخرى على ثريد آخر :
c#:
vb.net:
وتنفيذ بعض العمليات حتى الانتهاء من تنفيذ الثريد
C#:
vb.net:
الآن بما أننا خرجنا من ال Loop السابقة فهذا يعني انتهاء التنفيذ الأول ، الآن سنقوم بتنفيذ العملية التي نريدها .
C#:
vb.net:
فقط !
تبقى نقطة واحدة قبل انهاء وضع ال Connected وهي نقطة ال Transactions ، وهي ما سنتحدث عنه لاحقاً .
في هذه الجزئية سنحاول تعلم طريقة تمنعنا من عمل عدة عمليات على قواعد البيانات في نفس الوقت لمنع التضارب ، ومع ان المشكلة ستواجهنا بصورة اكبر في الوضع المنفصل Disconnected والذي هو موضوع درسنا القادم ، إلا اننا سنجرب الحل في هذه العجالة السريعة ، جرب المثال التالي :
C#:
كود :
[SIZE=3]SqlConnection cn = new SqlConnection();
cn.ConnectionString =
@"Data Source=(local)\SQLEXPRESS;Integrated Security=SSPI;" +
"Initial Catalog=AutoLot;Asynchronous Processing=true";
cn.Open();[/SIZE]vb.net:
كود :
[SIZE=3]Dim cn As New SqlConnection()
cn.ConnectionString = "Data Source=(local)\SQLEXPRESS;Integrated Security=SSPI;" + "Initial Catalog=AutoLot;Asynchronous Processing=true"
cn.Open() [/SIZE]أول خطوة قمنا بها هي تعريف الوضع Asynchronous Processing=true في ال ConnectioString بهذه الطريقة اصبحنا قادرين على الاستفادة من الدوال التالية :
BeginExecuteReader() و EndExecuteReader()
BeginExecuteNonQuery() و EndExecuteNonQuery()
BeginExecuteXmlReader() وEndExecuteXmlReader()
سنجرب الآن على BeginExecuteReader و EndExecuteReader ، وسنبدأ بتأخير جملة الاستعلام الأولى لخمس ثوان مثلاً :
c#:
كود :
[SIZE=3]string strSQL = "WaitFor Delay '00:00:05';Select * From Employee_info";
SqlCommand myCommand = new SqlCommand(strSQL, cn);[/SIZE]vb.net:
كود :
[SIZE=3]Dim strSQL As String = "WaitFor Delay '00:00:05';Select * From Employee_info"
Dim myCommand As New SqlCommand(strSQL, cn) [/SIZE]هنا سنقوم بتنفيذ عمليات أخرى على ثريد آخر :
c#:
كود :
IAsyncResult itfAsynch;
itfAsynch = myCommand.BeginExecuteReader(CommandBehavior.CloseConnection);كود :
[SIZE=3]Dim itfAsynch As IAsyncResult
itfAsynch = myCommand.BeginExecuteReader(CommandBehavior.CloseConnection)[/SIZE]وتنفيذ بعض العمليات حتى الانتهاء من تنفيذ الثريد
C#:
كود :
[SIZE=3]while (!itfAsynch.IsCompleted)
{
// تغيير قيمة مؤشر مثلاً .
Thread.Sleep(1000);
}[/SIZE]vb.net:
كود :
While Not itfAsynch.IsCompleted
' تغيير قيمة مؤشر مثلاً .
Thread.Sleep(1000)
End Whileالآن بما أننا خرجنا من ال Loop السابقة فهذا يعني انتهاء التنفيذ الأول ، الآن سنقوم بتنفيذ العملية التي نريدها .
C#:
كود :
[SIZE=3]SqlDataReader myDataReader = myCommand.EndExecuteReader(itfAsynch);
while (myDataReader.Read())
{
MessageBox.Show(myDataReader[1].ToString());
}
myDataReader.Close();[/SIZE]vb.net:
كود :
[SIZE=3]Dim myDataReader As SqlDataReader = myCommand.EndExecuteReader(itfAsynch)
While myDataReader.Read()
MessageBox.Show(myDataReader(0).ToString())
End While
myDataReader.Close()[/SIZE]فقط !
تبقى نقطة واحدة قبل انهاء وضع ال Connected وهي نقطة ال Transactions ، وهي ما سنتحدث عنه لاحقاً .
