当前位置:  开发笔记 > 后端 > 正文

如何在参数中使用"Like"

如何解决《如何在参数中使用"Like"》经验,为你挑选了1个好方法。

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

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

Joel Coehoor.. 10

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

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

    它没有正确处理null ErrorNumbers.我不认为这是它,因为空字符串应该仍然匹配该查询的所有内容.但修复空值将改善该情况的性能.

    它将它视为数字类型而不是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();
    }
}

顺便说一句:我不是第一个给你那个代码吗?:)



1> Joel Coehoor..:
WHERE message like '%' + @ErrorMessage + '%'

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

    它没有正确处理null ErrorNumbers.我不认为这是它,因为空字符串应该仍然匹配该查询的所有内容.但修复空值将改善该情况的性能.

    它将它视为数字类型而不是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();
    }
}

顺便说一句:我不是第一个给你那个代码吗?:)

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有