2009-02-25 9 views
2

ile nasıl kullanılır Parametre kullanarak log tablosumuzdaki bir alana bir diziye gömülü bir sayı aramak istiyorum.'Like' parametresini

select * vwLogs nereden log_time> '02/2009' ve benzeri mesajı ben fıkra olduğu eşittir işaretiyle ancak zaman parametreleri kullanmayı biliyor ('% 2009022508241446%')

/24 ile bunu nasıl emin

'gibi' bu

WHERE message like ('%@ErrorMessage%') 

sağ sadece bu denenmiş ve işe yaramadı görünmüyor. Yeni tek şey bu bilmiyorum Düzenlemenize dayanarak

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

cevap

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

çalışmak var yardım

için

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

Teşekkür mesaj arama parçasıdır hataya neyin sebep olduğunu hemen görün, ancak iki potansiyel sorunla karşılaştım:

  1. Bu, boş ErrorNumbers öğelerini doğru şekilde işlemiyor. Bunun böyle olduğunu sanmıyorum çünkü boş bir dize hala bu sorgu için her şeyle eşleşmelidir. Ancak, boş değerlerin düzeltilmesi bu durum için performansı artıracaktır.
  2. Bir varchar yerine sayısal bir tür olarak davranıyor. Bu aynı zamanda performans etkilerine de sahiptir ve aslında LIKE sorgusunu kırabilir: Davranışın kafamın üstünde ne olduğunu hatırlamıyorum.

bu deneyin:

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

BTW: Sana ilk etapta bu kodu vermedi? :)

+0

Evet harika çalıştı, sonra sadece kullanıcı adı ile günlük numarası ve somun ile arama yapabilmek için bir fikrim vardı ve hata numarası bir dizeye gömülü olduğundan sorun yaşamaya başladım. –

+0

Şimdi bu hata iletisini alıyorum Hata 'System.DBNull' ile 'string' arasında örtük bir dönüşüm olmadığından koşullu ifadenin türü belirlenemiyor –

+0

D'oh! Küçük tuhaflığı unuttum. Bu doğru, güzel, özlü üçlü operatörden ziyade, daha uzun bir eğer/else yapısına genişletmek zorundasınız. –

1

veya @ErrorMessage% zaten içeriyorsa, ör. @ErrorMessage = 'ABCD%' o zaman bu da Sen doğru yolda

... WHERE message like @ErrorMessage 
4

çalışır, ancak bu şekilde kullanacağız:

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


SELECT messageId FROM [yourTable] 
WHERE message like @ErrorMessage 

Aksi Sunucu yürütme önbelleğe mümkün olmayacaktır plan