2009-02-25 20 views
2

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

選択* vwLogs からどこlog_time> '02/2009' と同様 メッセージ私は句がどこにある等号ではなく時にパラメータを使用する方法を知っている( 『%2009022508241446%』)

/24でそれを行う方法がわから

「LIKE」これは

WHERE message like ('%@ErrorMessage%') 

右私はこれを試み、それがうまくいかなかったようではありません。新しい唯一のことは、私は私にはない、これはあなたの編集に基づいて

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

答えて

10
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 ([email protected] 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(); 
     } 
    } 

感謝メッセージ検索部であり、エラーの原因をすぐに確認してください.2つの潜在的な問題が見つかりました:

  1. null ErrorNumbersを正しく処理できません。空の文字列でもそのクエリのすべてが一致するはずなので、これとは思えません。しかし、nullを修正すると、そのケースのパフォーマンスが向上します。
  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 ([email protected] 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(); 
    } 
} 

はところで:私は、最初の場所で、あなたにそのコードを与えていませんか? :)

+0

ええ、私はログ番号とナットだけでユーザー名を検索することができると思っていました。エラー番号が文字列に埋め込まれているので、問題が発生したときです。 –

+0

今このエラーメッセージが表示されます エラー 'System.DBNull'と 'string'の間の暗黙的な変換がないため、条件式の型を特定できません –

+0

D'oh!小さな奇妙なことを忘れてしまった。それは間違いなく簡潔な三項演算子ではなく、より長いif/else構造に展開する必要があります。 –

1

または@ ErrorMessageに%が既に含まれている場合(例: @ErrorMessageは=「ABCDの%」これはまた、あなたが正しい道の上にありますが、このようにそれを使用

... WHERE message like @ErrorMessage 
4

に動作します:

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


SELECT messageId FROM [yourTable] 
WHERE message like @ErrorMessage 

そうでない場合は、サーバーは、実行をキャッシュすることはできませんプラン

関連する問題