我想搜索名稱的empid,並在我的文本框中輸入字符。使用通配符。我寫的聲明使用文本框值和通配符搜索
da = new SqlDataAdapter(
"Select empID from emp where FirstName like ' "+textbox1.text+" ' % "
, connstring);
da.Fill(ds);
是這種說法是否正確?
我想搜索名稱的empid,並在我的文本框中輸入字符。使用通配符。我寫的聲明使用文本框值和通配符搜索
da = new SqlDataAdapter(
"Select empID from emp where FirstName like ' "+textbox1.text+" ' % "
, connstring);
da.Fill(ds);
是這種說法是否正確?
該陳述有許多不妥之處。
簡單的一點是,您的單引號和文本框值之間有空格,百分號不在需要的位置。另外,textbox1.text
拼寫錯誤。它應該更接近:
da = new SqlDataAdapter(
"Select empID from emp where FirstName like '"+textbox1.Text+"%' ", connstring);
但這只是第一個問題。 更大的問題是,這是SQL注入的主要候選者。見How do parameterized queries help against SQL injection?
你是開放的sql-injection,用sql-parameters
代替:
string sql = "SELECT empID " +
"FROM emp " +
"WHERE FirstName like @FirstName";
using(var con = new SqlConnection(connstring))
using (SqlCommand command = new SqlCommand(sql, con))
{
command.Parameters.AddWithValue("@FirstName", textbox1.text + "%");
using(var da = new SqlDataAdapter(command))
{
da.Fill(ds);
}
}
的跡象%需參數值的一部分,使用綁定,當你不需要單引號在所有參數。
您輸入的語句將允許在通配符搜索之前的名字前面和後面的空格。如果你要搜索一個名字的任何部分,你需要改變你的SQL是這樣的:
SELECT empID FROM emp WHERE FirstName LIKE '@FirstName%'
而且,它是更安全使用parameretized查詢,這樣對剛剛串聯你的論點:
StringBuilder sb = new StringBuilder();
sb.Append("SELECT empID FROM emp WHERE FirstName LIKE '@FirstName%'");
SqlConnection conn = new SqlConnection(connStr);
SqlCommand command = new SqlCommand(sb.ToString());
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue("FirstName", textbox1.Text);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(command);
da.Fill(dt);
如果你想使用存儲過程,你需要設置你的SqlCommand對象,像這樣:
SqlCommand command = new SqlCommand("Procedure", conn);
command.CommandType = Command.StoredProcedure;
[媽媽的漏洞(http://xkcd.com/327/) –
懇求選擇這個問題的答案。謝謝! –