Parameterized Queries
در واقع به معنای ارزیابی پارامترها و ارسال آن ها به دیتابیس می باشد. در واقع یکی از تکنیک های هکرها برای ورود به سایت ارسال یک کد به جای متن معتبر به سرور می باشد که ممکن است باعث اجرای آن در بارگزاری مجدد سایت شده و لذا به سایت آسیب برسد و یا امکان نفوذ برای کاربر به دیتابیس فراهم شود. لذا می توان از کدهایی استفاده کرد که ابتدا مقادیر ورودی کاربران را ارزیابی کرده و نتیجه ارزیابی را به صورت رشته ای معتبر برای پردازش به سرور ارسال نماید.
1- ابتدا رشته اتصال را تعریف می نماییم :
connectionString="Data Source=.\SQLEXPRESS;database=Northwind;
AttachDbFileName=|DataDirectory|\NORTHWND.MDF;Integrated Security=true"/>
2- فضای نامی های مورد نیاز را وارد می نماییم :
using System.Data;
using System.Data.SqlClient;
3- یک Select Queries برای بازیابی داده ها از دیتابیس می نویسیم :
private DataTable GetData(SqlCommand cmd)
{
DataTable dt = new DataTable ();
String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
SqlDataAdapter sda = new SqlDataAdapter();
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
try
{
con.Open();
sda.SelectCommand = cmd;
sda.Fill(dt);
return dt;
}
catch (Exception ex)
{
Response.Write(ex.Message);
return null;
}
finally
{
con.Close();
sda.Dispose();
con.Dispose();
}
}
همانطور که می بینید ، تابع ابتدا دستور sql را اجرا کرده
و سپس نتیجه را در DataTable قرار داده و آن را بر می گرداند . حال می
توان مقدار زیر را به تابع بالا ارسال نمود :
string strQuery = "select * from customers";
SqlCommand cmd = new SqlCommand(strQuery);
DataTable dt = GetData(cmd);
GridView1.DataSource = dt;
GridView1.DataBind();
اجرای دستورات sql به کمک Filter Condition
به کمک متد parameter می توان عمل ارزیابی ورودی ها قبل از ارسال به تابع را اناجم داد . در تابع زیر پارامتر @city با مقدار txtCity.Text تعریف و ارزیابی می شود.
string strQuery = "select * from customers where city = @city";
SqlCommand cmd = new SqlCommand(strQuery);
cmd.Parameters.AddWithValue("@city", txtCity.Text.Trim());
DataTable dt = GetData(cmd);
GridView1.DataSource = dt;
GridView1.DataBind();
2- Insert - Update Queries
در ادامه به برسی دستورات درج و به روز رسانی می پردازیم:
private Boolean InsertUpdateData(SqlCommand cmd)
{
String strConnString =
System.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
try
{
con.Open();
cmd.ExecuteNonQuery();
return true;
}
catch (Exception ex)
{
Response.Write(ex.Message);
return false;
}
finally
{
con.Close();
con.Dispose();
}
}
مقدار زیر را به تابع فوق ارسال می کنیم. تابع ابتدا نوع عملیات را بررسی کرده و حسب نوع عملیات , کد مورد نظر را اجرا می کند. تابع عمل درج را برای ورودی زیر تشخیص می دهد:
string strQuery;
SqlCommand cmd;
strQuery = "insert into customers (CustomerID, CompanyName) values(@CustomerID, @CompanyName)";
cmd = new SqlCommand(strQuery);
cmd.Parameters.AddWithValue("@CustomerID", "A234");
cmd.Parameters.AddWithValue("@CompanyName", "DCB");
InsertUpdateData(cmd);
با ارسال مقدار زیر به تابع ، عمل به روز رسانی تشخیص داده می شود :
string strQuery;
SqlCommand cmd;
strQuery = "update customers set CompanyName=@CompanyName where CustomerID=@CustomerID";
cmd = new SqlCommand(strQuery);
cmd.Parameters.AddWithValue("@CustomerID", "A234");
cmd.Parameters.AddWithValue("@CompanyName", "BCD");
InsertUpdateData(cmd);