2014-10-10 76 views
0

美好的一天!我很难解决这个问题。我一直在寻找答案,但似乎很难找到最合适的答案。asp.net - 在数据库中搜索包含撇号的数据

我使用此查询根据用户在txtSearchRP文本框中输入的内容搜索租户的名称,它对数据没有撇号的情况非常适用,但是当用户搜索包含''的名称时,功能不佳。

例如:用户输入Max的搜索MAX的餐厅

从租户

SELECT * WHERE(名称LIKE '% “+ txtSearchRP.Text +” %')

感谢您的帮助提前!


编辑的详细资料:

我其实传递查询的SqlDataSource到GridView自动绑定后,用户点击该按钮。

SqlDataSource3.SelectCommand = SELECT * FROM租户WHERE(名称LIKE '% “+ txtSearchRP.Text +” %')

+0

只需将_MAX'S_中的单引号替换为两个单引号,即_name LIKE'%MAX''%'_ – bjan 2014-10-10 04:32:32

+0

感谢您的回复,请注意类似的操作符必须基于搜索框(用户输入) - txtSearcRP.Text。我如何使用你提出的答案修改(名称LIKE'%“+ txtSearchRP.Text +”%')? – rickyProgrammer 2014-10-10 04:44:38

+0

使用String的替换方法 – bjan 2014-10-10 04:48:35

回答

0

感谢所有谁分享他们的知识和努力,终于获得通过串答案替代方法

这里的3你张贴在这里-LINED CODE

string value = txtSearchRP.Text; 
value = value.Replace("'", "['']"); 
sqlDataSource3.SelectCommand = "SELECT * from tenant WHERE (name LIKE '%" + value.ToString() +"%')"; 

通过加盟的努力,答案,我们解决问题的简单st形式:)

+0

你应该使用参数化的语句,如NMK显示,并阅读人们说什么时[SQL注入](http ://en.wikipedia.org/wiki/SQL_injection)。 – MikeSmithDev 2014-10-11 17:16:49

2

试试这个

conn = new 
    SqlConnection("ConnectionString"); 
conn.Open(); 

SqlCommand cmd = new SqlCommand(
    "SELECT * from tenant WHERE (name LIKE @tenant)", conn); 
SqlParameter param = new SqlParameter(); 
param.ParameterName = "@tenant"; 
param.Value   = "%" + txtSearchRP.Text + "%"; // you can use any wildcard operator 
cmd.Parameters.Add(param); 
SqlDataReader reader = cmd.ExecuteReader(); 
+0

这将是一个SQL语法错误。 '%@ tenant%'不是合法的语法。 – recursive 2014-10-10 04:34:42

+0

然后,可能会将通配符运算符附加为值的一部分。 – NMK 2014-10-10 04:37:39

+0

有没有其他方法可以解决使用注射的问题?尽管如此,感谢您将会尝试您的答案并更新您的结果。 – rickyProgrammer 2014-10-10 04:59:34

0

更好的方式来创建的StoredProcedure

SP:

Create proc sp_Search(@txtSearch nvarchar(150)) 
as begin 
    SELECT * from tenant WHERE name like @txtSearch+'%' 
end 

后面的代码:

string txtSearch = txtSearchRP.Text; 
     SqlDataReader dr; 
     using (SqlConnection conn = new SqlConnection(cn.ConnectionString)) 
     { 
      using (SqlCommand cmdd = new SqlCommand()) 
      { 
       cmdd.CommandType = CommandType.StoredProcedure; 
       cmdd.CommandText = "sp_Search"; 
       cmdd.Parameters.AddWithValue("@txtSearch", txtSearch); 
       cmdd.Connection = conn; 
       conn.Open(); 
       dr = cmdd.ExecuteReader(CommandBehavior.CloseConnection); 

       if (dr.HasRows) 
       { 
        while (dr.Read()) 
        { 
         var name = dr["name"].ToString(); 
         var location = dr["location"].ToString(); 
        } 
       } dr.Close(); 
       conn.Close(); 

      } 
     } 

更新时间: 写返回的数据表的功能,使我们可以把它绑定到我们的GridView控件正如我在代码做了以下

public DataTable bindGridView() 
    { 
    string txtSearch = txtSearchRP.Text; 
    DataTable dt = new DataTable(); 
    using (SqlConnection con = new SqlConnection(cn.ConnectionString)) 
     { 
      SqlCommand cmdd = new SqlCommand(); 
      cmdd.CommandType = CommandType.StoredProcedure; 
      cmdd.CommandText = "sp_Search"; 
      cmdd.Parameters.AddWithValue("@txtSearch", txtSearch); 
      cmdd.Connection = con; 
      con.Open(); 
      SqlDataAdapter dap = new SqlDataAdapter(cmdd); 
      DataSet ds = new DataSet(); 
      dap.Fill(ds); 
      dt = ds.Tables[0]; 
      con.Close(); 

     } 
     return dt; 
    } 

开按钮点击:调用bindGridView()函数进行绑定Gridview控件

GridView1.DataSource = bindGridView(); 
GridView1.DataBind(); 
+0

谢谢你,对不起这个问题,但我怎么可以通过sqldatasource填充gridview后,我点击按钮找到? – rickyProgrammer 2014-10-10 08:22:21

+0

我包含以下几行:SqlDataSource3.SelectCommand =“SELECT * from tenant WHERE(name LIKE'%”+ name +“%'); ModalPopupExtenderRP.Show();在if-while语句中测试名称变量,仍然是当我在关键字搜索中包含一个撇号时,没有阅读或给出过滤结果,但它使用纯正的字符串关键字很好地工作。 – rickyProgrammer 2014-10-10 08:40:43

+0

非常感谢您为此示例尝试了这一点,但我不能执行我想要做的事情,谢谢努力:) – rickyProgrammer 2014-10-11 03:03:43

0

除了已经给出的答案之外,在某些应用程序中,您可能需要在用户提供的输入字符串中考虑escaping wildcards such as %。例如,如果用户输入“25%”,则匹配“%25 %%”将返回包含“25”的值,而不是限制为包含“25%”的值。

可以逃避通配符(用于SQL Server),如下所示:

string value = ... value entered by user; 
value = value.Replace("[", "[[]"); 
value = value.Replace("_", "[_]"); 
value = value.Replace("%", "[%]"); 
+0

感谢这个非常非常好的例子,我想我已经知道该怎么做.. – rickyProgrammer 2014-10-11 03:02:48