如何在参数中使用“Like”

时间:2009-02-25 20:53:13

标签: asp.net sql parameters sql-like

我想使用参数在日志表的字段中搜索嵌入字符串中的数字。

从vwLogs中选择* 其中log_time> '02 / 24/2009'和 消息('%2009022508241446%')

我知道当where子句是等号时如何使用参数但不知道如何使用'Like'

这似乎不对

 WHERE message like ('%@ErrorMessage%')

我刚试过这个并没有用。唯一新的是消息搜索部分

protected void btnRunQuery_Click(object sender, EventArgs e)
    {
        string strConn, strSQL;
        strConn = @";";
        strSQL = @"SELECT * FROM weblogs.dbo.vwlogs WHERE Log_time >= @BeginDate AND Log_Time < @EndDate AND (client_user=@UserName OR @UserName IS NULL) AND (message like '%' + @ErrorNumber + '%' OR @ErrorNumber IS NULL) ORDER BY Log_time DESC";

        using (SqlConnection cn = new SqlConnection(strConn))
        {
            SqlCommand cmd = new SqlCommand(strSQL, cn);


            cmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
            cmd.Parameters.AddWithValue("@ErrorNumber", txtErrorNumber.Text);

            cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value =
                DateTime.Parse(txtBeginDate.Text).Date;
            cmd.Parameters.Add("@EndDAte", SqlDbType.DateTime).Value =
                // add one to make search inclusive
                DateTime.Parse(txtEndDate.Text).Date.AddDays(1);


            cn.Open();
            SqlDataReader rdr = cmd.ExecuteReader();

            GridView1.DataSource = rdr;
            GridView1.DataBind();

            cn.Close();
        }
    }

感谢您的帮助

我让这个工作

   if (string.IsNullOrEmpty(txtUserName.Text))
   {
       cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = DBNull.Value; 
   }
   else
   {
       cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = txtUserName.Text;
   }

   if (string.IsNullOrEmpty(txtErrorNumber.Text))
   {
       cmd.Parameters.Add("@ErrorNumber", SqlDbType.VarChar, 50).Value = DBNull.Value;
   }
   else
   {
       cmd.Parameters.Add("@ErrorNumber", SqlDbType.VarChar, 50).Value = txtErrorNumber.Text;
   }

3 个答案:

答案 0 :(得分:10)

WHERE message like '%' + @ErrorMessage + '%'

根据您的编辑,我不会立即看到导致您错误的原因,但我确实发现了两个潜在问题:

  1. 它没有正确处理null ErrorNumbers。我不认为这是它,因为空字符串应该仍然匹配该查询的所有内容。但修复空值将改善该情况的性能。
  2. 它将它视为数字类型而不是varchar。这也有性能影响,实际上可能会打破LIKE查询:我不记得这种行为是什么。
  3. 试试这个:

    protected void btnRunQuery_Click(object sender, EventArgs e)
    {
        string strConn = @";";
        string strSQL =
             "SELECT * "
          + " FROM weblogs.dbo.vwlogs"
          + " WHERE Log_time >= @BeginDate AND Log_Time < @EndDate"
              + " AND (client_user=@UserName OR @UserName IS NULL)" 
              + " AND (message like '%' + @ErrorNumber + '%' OR @ErrorNumber IS NULL)"
          + " ORDER BY Log_time DESC";
    
        using (SqlConnection cn = new SqlConnection(strConn))
        using (SqlCommand cmd = new SqlCommand(strSQL, cn))
        {
            cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value =
                DateTime.Parse(txtBeginDate.Text).Date;
            cmd.Parameters.Add("@EndDAte", SqlDbType.DateTime).Value =
                // add one to make search inclusive
                DateTime.Parse(txtEndDate.Text).Date.AddDays(1);
            cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = 
                string.IsNullOrEmpty(txtUserName.Text) ? DBNull.Value : txtUserName.Text;
            cmd.Parameters.Add("@ErrorNumber", SqlDbType.VarChar, 50).Value =
                string.IsNullOrEmpty(txtErrorNumber.Text) ? DBNull.Value : txtErrorNumber.Text;
    
            cn.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
    
            GridView1.DataSource = rdr;
            GridView1.DataBind();
        }
    }
    
    顺便说一句:我不是第一个给你那个代码吗? :)

答案 1 :(得分:4)

你走在正确的道路上,但是这样使用它:

SET @ErrorMessage = '%' + @ErrorMessage + '%'


SELECT messageId FROM [yourTable]
WHERE message like @ErrorMessage

否则服务器将无法缓存执行计划

答案 2 :(得分:1)

或者@ErrorMessage是否包含%,例如@ErrorMessage ='ABCD%'然后这也将起作用

... WHERE message like @ErrorMessage