我想搜索一个带有在我的文本框中输入的字符的名称的empid。使用通配符。我写了声明
da = new SqlDataAdapter(
"Select empID from emp where FirstName like ' "+textbox1.text+" ' % "
, connstring);
da.Fill(ds);
这句话是否正确?
答案 0 :(得分:1)
您向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);
}
}
%符号必须是参数值的一部分,并且在使用绑定参数时根本不需要单引号。
答案 1 :(得分:1)
您输入的语句将允许在通配符搜索之前在名字前面和第一个名称后面留出空格。如果要搜索名字的任何部分,则应将SQL更改为以下内容:
SELECT empID FROM emp WHERE FirstName LIKE '@FirstName%'
此外,使用像这样的参数化查询比仅仅连接你的参数更安全:
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;
答案 2 :(得分:0)
这句话有很多不妥之处。
简单的一点是,您的单引号和文本框值之间有空格,百分号超出了需要的位置。此外,textbox1.text
拼写错误。它应该更接近:
da = new SqlDataAdapter(
"Select empID from emp where FirstName like '"+textbox1.Text+"%' ", connstring);
但那只是第一个问题。 更大的问题是,这是SQL注入的主要候选者。请参阅How do parameterized queries help against SQL injection?