Как использовать «Мне нравится» с параметром - PullRequest
2 голосов
/ 25 февраля 2009

Я хочу найти число, встроенное в строку в поле нашей таблицы журнала, используя параметр.

выбрать * из 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 ]

10 голосов
/ 25 февраля 2009
WHERE message like '%' + @ErrorMessage + '%'

На основании ваших правок я не сразу вижу причину вашей ошибки, но обнаружил две потенциальные проблемы:

  1. Он неправильно обрабатывает нулевые номера ошибок. Я не думаю, что это так, потому что пустая строка все равно должна соответствовать всему запросу. Но исправление нулей улучшит производительность в этом случае.
  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();
    }
}

Кстати: разве я не дал вам этот код? :)

4 голосов
/ 25 февраля 2009

Вы на правильном пути, но используйте его следующим образом:

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


SELECT messageId FROM [yourTable]
WHERE message like @ErrorMessage

В противном случае сервер не сможет кэшировать план выполнения

1 голос
/ 25 февраля 2009

или если @ErrorMessage уже содержит%, например, @ErrorMessage = 'ABCD%', тогда это также будет работать

... WHERE message like @ErrorMessage
...