2

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

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

3 回答 3

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

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

于 2009-02-25T20:54:31.293 回答
4

您走在正确的道路上,但请以这种方式使用它:

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


SELECT messageId FROM [yourTable]
WHERE message like @ErrorMessage

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

于 2009-02-25T20:58:05.653 回答
1

或者如果@ErrorMessage 已经包含 %,例如 @ErrorMessage = 'ABCD%' 那么这也可以

... WHERE message like @ErrorMessage
于 2009-02-25T20:57:44.500 回答