تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس الثالث والستون - عالم ADO.net وما يتعلق به - الجزء الثالث
#4
- استخدام ال Parameterized Command Objects :

كما لاحظت من الدرس الذي تحدثنا فيه عن ال SQL Injection ، فإن الطريقة التقليدية لجمل الاستعلام تظل خطرة ، لذا نبدا باستخدام Parameters لجمل الاستعلام لدينا ايضاً حتى لو لم نكن نتعامل مع Stored Procedure .

لو أخذنا المثال التالي للتجربة :

C#:

كود :
[SIZE=3]string strSQL = "Select [First Name]+[Last Name] as [Full Name], Age From Employee where ID=" + ID;
SqlCommand myCommand = new SqlCommand(strSQL, cn);[/SIZE]

vb.net:

كود :
[SIZE=3]Dim strSQL As String = "Select [First Name]+[Last Name] as [Full Name], Age From Employee where ID=" + ID
Dim myCommand As New SqlCommand(strSQL, cn) [/SIZE]


ستجد اننا قادرين بمبادئ ال SQL Injection من اختراق هذا النظام بسهولة ، لذا البديل يكون باستخدام وتعريف SqlParameter:
C#:

كود :
[SIZE=3]string sql = string.Format("Select [First Name]+[Last Name] as [Full Name], Age From Employee where [/SIZE][SIZE=3]ID=@ID[/SIZE][SIZE=3]");
using(SqlCommand cmd = new SqlCommand(sql, this.sqlCn))
{
// Fill params collection.
SqlParameter param = new SqlParameter();
param.ParameterName = "@ID";
param.Value = 10;
param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(param);[/SIZE]
[SIZE=3]// تنفيذ جملة الاستعلام بأي شكل هنا
cmd.ExecuteNonQuery();
}[/SIZE]


vb.net:

كود :
Dim sql As String = String.Format("Select [First Name]+[Last Name] as [Full Name], Age From Employee where

كود :
[SIZE=3]ID=@ID[/SIZE][SIZE=3]")
Using cmd As New SqlCommand(sql, Me.sqlCn)
' Fill params collection.
Dim param As New SqlParameter()
param.ParameterName = "@ID"
param.Value = 10
param.SqlDbType = SqlDbType.Int
cmd.Parameters.Add(param)

' تنفيذ جملة الاستعلام بأي شكل هنا
cmd.ExecuteNonQuery()
End Using[/SIZE]

هنا كما لاحظت قمنا بتمرير باميترات إلى جملة استعلام قمنا نحن بكتابتها ضمن البرنامج .

- الحالة الثانية التي لدينا وهي الشائعة الاستخدام هي حالة تعريف Stored Procedure ، لو افترضنا مثلاً جملة الاستعلام التي أنشأناها في أول درس لنا بالشكل التالي :


كود :
[SIZE=3]ALTER PROCEDURE dbo.GetAge[/SIZE]
[SIZE=3]@condition int,
@firstname char(10) output[/SIZE]
[SIZE=3]AS[/SIZE]
[SIZE=3]SELECT @firstname=[First Name] from Employee_info where age > @condition[/SIZE]


وقمنا بحفظها باسم GetAge ، الآن نريد استدعاءها من البرنامج ، يتم ذلك بالشكل التالي مثلاً :

C#:

كود :
[SIZE=3]using (SqlCommand cmd = new SqlCommand("GetAge", cn))
{
cmd.CommandType = CommandType.StoredProcedure;[/SIZE]
[SIZE=3]SqlParameter param = new SqlParameter();
param.ParameterName = "@condition";
param.SqlDbType = SqlDbType.Int;
param.Value = myAge;
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param);[/SIZE]

[SIZE=3]param = new SqlParameter();
param.ParameterName = "@firstnameName";
param.SqlDbType = SqlDbType.Char;
param.Size = 10;
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);[/SIZE]

[SIZE=3]cmd.ExecuteNonQuery();
MessageBox.Show(cmd.Parameters["@firstName"].Value.ToString());
}[/SIZE]

vb.net:

كود :
Using cmd As New SqlCommand("GetAge", cn)
cmd.CommandType = CommandType.StoredProcedure

Dim param As New SqlParameter()
param.ParameterName = "@condition"
param.SqlDbType = SqlDbType.Int
param.Value = myAge
param.Direction = ParameterDirection.Input
cmd.Parameters.Add(param)



param = New SqlParameter()
param.ParameterName = "@firstnameName"
param.SqlDbType = SqlDbType.[Char]
param.Size = 10
param.Direction = ParameterDirection.Output
cmd.Parameters.Add(param)



cmd.ExecuteNonQuery()
MessageBox.Show(cmd.Parameters("@firstName").Value.ToString())
End Using


كما لاحظت ، قمنا بتعريف نوع ال Command هنا نظراً لإن الافتراضي هو Text ، ومن ثم قمنا بتعريف متغير الدخول ومتغير الخروج أيضاً .
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
الدرس الثالث والستون - عالم ADO.net وما يتعلق به - الجزء الثالث - بواسطة Raggi Tech - 14-10-12, 09:11 PM


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 2 ) ضيف كريم