【问题标题】:How to Use 'Like' with a parameter如何使用带有参数的“Like”
【发布时间】:2009-02-25 20:53:13
【问题描述】:

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

从 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;
   }

【问题讨论】:

    标签: asp.net sql parameters sql-like


    【解决方案1】:
    WHERE message like '%' + @ErrorMessage + '%'
    

    根据您的编辑,我没有立即看出是什么导致了您的错误,但我确实发现了两个潜在问题:

    1. 它没有正确处理 null ErrorNumbers。我不认为是这样,因为空字符串仍应匹配该查询的所有内容。但修复空值将提高这种情况下的性能。
    2. 它将其视为数字类型而不是 varchar。这也会对性能产生影响,并且实际上可能会破坏 LIKE 查询:我不记得这种行为是什么。

    试试这个:

    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();
        }
    }
    

    顺便说一句:我不是一开始就给了你那个代码吗? :)

    【讨论】:

    • 是的,它工作得很好,然后我想到了能够通过日志号和 nut 只是用户名进行搜索,那时我开始遇到问题,因为错误号嵌入在字符串中。
    • 现在我收到此错误消息错误 1 ​​条件表达式的类型无法确定,因为 'System.DBNull' 和 'string' 之间没有隐式转换
    • 天啊!忘记了那个小怪癖。没错,您必须将其扩展为更长的 if/else 构造,而不是漂亮、简洁的三元运算符。
    【解决方案2】:

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

    SET @ErrorMessage = '%' + @ErrorMessage + '%'
    
    
    SELECT messageId FROM [yourTable]
    WHERE message like @ErrorMessage
    

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

    【讨论】:

      【解决方案3】:

      或者如果@ErrorMessage 已经包含 %,例如@ErrorMessage = 'ABCD%' 那么这也将起作用

      ... WHERE message like @ErrorMessage
      

      【讨论】:

        猜你喜欢
        • 2010-10-04
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2020-10-29
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        相关资源
        最近更新 更多