کلاس Parameter

ما می‌توانیم هنگام تعریف کردن عبارت پرس و جو در commandText که یک خصوصیت از کلاس DbComnmand است به جای این که کل عبارت پرس و جو را به صورت رشته تعریف کنیم در آن از پارامترها هم استفاده کنیم. در صورت عدم استفاده از پارامترها، مجبوریم به صورت دستی مقادیر را در عبارت پرس و جو بنویسیم. مثلاً می‌خواهیم تمام دانشجوهایی که دارای شماره دانشجویی (studentId) خاصی هستند را select کنیم. برای این کار شماره دانشجویی را از کاربر می‌گیریم و دستور را تولید می‌کنیم.

int studentId = Int32.Parse(Console.ReadLine());
SqlCommand command = new SqlCommand();
command.CommandText = "SELECT * FROM Students WHERE EmployeeId = " + studentId;

در مثال بالا از کاربر خواسته می‌شود که شماره دانشجویی را بدهد. این کار را با Console.ReadLine() انجام، سپس در خط سوم آن را به commandText می‌دهیم. این روش برای کد نویسی راحت است ولی از نظر امنیتی مشکل دارد چرا که کاربر هر چیزی را در query می‌تواند اضافه کند. این روش برای کار کردن با پارامترها روش درستی نیست به خاطر همین #C برای کار کردن با پارامترها کلاسهایی را در اختیار ما قرار داده است که در زیر می‌بینیم که همه آنها از کلاس پایه DbParameter ارث بری می‌کنند.

Provider کلاس Parameter
SQL Server SqlParameter
OLE DB OleDbParameter
ODBC OdbcParameter

قبل از کار با کلاسهای پارامتر باید در داخل CommandText مشخص کنیم که چه چیزی پارامتر است برای این کار قبل از اسم پارامتر باید با علامت @ قرار دهیم به مثال زیر.

SqlCommand command = new SqlCommand();
command.CommandText = "SELECT * FROM Students WHERE Age=@Age";

در مثال بالا به @Age در داخل عبارت SQL توجه کنید. در عبارت پرس و جو می‌بینیم تمام دانشجویانی که سن آنها برابر با @Age است را عبارت پرس و جو می‌گیرد که Age یک متغیر و پارامتری است که ما مشخص کرده‌ایم. وقتی #C این پرس و جو را می‌سازد به جای @Age مقداری را قرار می دهدبرای استفاده از یک پارامتر باید اسم پارامتر و نوعی که این پارامتر در خود دارد را مشخص کنیم. ADO.Net خود انواع داده‌ای احتمالی را که ممکن است که ما بخواهیم استفاده کنیم را در اختیار ما قرار داده و می‌توانیم از آنها استفاده کنیم. برای استفاده از آنها از انواع شمارشی System.Data.SqlDbType استفاده می‌کنیم یا اگر از دیتابیس‌ها OLE DB استفاده می‌کنیم باید از System.Data.OleDbType استفاده کنیم. کد زیر مثالی است که به ما می‌گوید که چگونه می‌شود از پارامترها استفاده کرد.

SqlParameter parameter1 = new SqlParameter("@Age", SqlDbType.Int);

سازنده مربوط به DbParameter در کد بالا که می‌بینیم اسم پارامتر و نوعی که این پارامتر می‌پذیرد را می‌گیرد. اگر هم بخواهیم از رشته‌ای با طول متغیر یعنی varchar(n) استفاده کنیم می‌توانیم از سازنده زیر برای آن استفاده کنیم.

SqlParameter parameter2 = new SqlParameter("@FirstName", SqlDbType.VarChar, 100);

سومین پارامتر در بالا، سایز نوع داده را مشخص می‌کند. در نهایت هم می‌توان مقداری که باید جایگزین آن پارامتر شود را مشخص کرد. مثل کد زیر.

parameter1.Value = 18;
parameter2.Value = "Mandy";

حالا می‌توانیم شیء پارامتر تولید شده را به خاصیت Parameters شیء DbCommand اضافه کنیم.

command.Parameters.Add(parameter1);

اگر چند پارامتر داشتیم همه آنها را اضافه می‌کردیم و ترتیب اضافه کردنشان اهمیتی نداشت. اما در هنگام استفاده از OLE DB استفاده می‌کنید باید آنها را به همان ترتیبی که در پرس و جو مشخص شده است اضافه کنید. روش دیگر اضافه کردن پارامترها با استفاده از متد ()addWithValue است که دیگر لازم نیست که پارامترها را بسازیم و نوع آنها را معلوم کنیم.

command.CommandText = "UPDATE Students SET FirstName=@FirstName, LastName=@LastName " + 
                      "WHERE StudentId=@StudentId";

command.Parameters.AddWithValue("@FirstName", "John");
command.Parameters.AddWithValue("@LastName", "Smith");
command.Parameters.AddWithValue("@StudentId", 1);

آرگومان اول پارامتر مربوطه است و آرگومان دوم مقداری است که جایگزین این پارامتر می‌شود. پارامتر دوم به صورت اتوماتیک به نوعی که در دیتابیس باید وارد شود تبدیل می‌شود. دوباره باید بگوییم که اگر شما از OLE DB استفاده می‌کنید باید پارامترها را به همان ترتیبی که در دستور دیده می‌شود وارد کنید.

command.CommandText = "UPDATE Students SET FirstName=@FirstName, LastName=@LastName " + 
                      "WHERE StudentId=@StudentId";

command.Parameters.AddWithValue("@LastName", "John");
command.Parameters.AddWithValue("@FirstName", "Smith");
command.Parameters.AddWithValue("@StudentId", 1);

مثلاً در مثال بالا باید اول @FirstName و سپس @LastName اضافه شود ولی برعکس اضافه شده که مشکل ساز خواهد شد. بنابراین هنگام استفاده از OLE DB مراقب باشید.