2

パラメータを使用して、ログ テーブルのフィールドの文字列に埋め込まれた数値を検索したいと考えています。

select * from vwLogs where log_time >'02/24/2009' and message like ('%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 + '%'

あなたの編集に基づいて、エラーの原因はすぐにはわかりませんが、2 つの潜在的な問題を見つけました。

  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 に答える