2009-02-25 6 views
2

Je veux rechercher un nombre incorporé dans une chaîne dans un champ de notre table de journal en utilisant un paramètre.Comment utiliser 'Like' avec un paramètre

select * from vwLogs où log_time> '02/24/2009' et message comme ('% 2009022508241446%)

Je sais comment utiliser les paramètres lorsque la clause where est un signe égal, mais pas vous comment le faire avec « Like »

cela ne semble pas droit

WHERE message like ('%@ErrorMessage%') 

J'ai juste essayé cela et cela n'a pas fonctionné. La seule chose nouvelle est la recherche de messages partie

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

Merci pour l'aide

Je suis que cela fonctionne

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

Répondre

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

En fonction de votre édition je ne immédiatement voir ce qui cause votre erreur, mais j'ai repéré deux problèmes potentiels:

  1. Il ne gère pas les null ErrorNumbers correctement. Je ne pense pas que ce soit le cas, car une chaîne vide devrait toujours correspondre à tout pour cette requête. Mais la correction des valeurs nulles améliorera les performances dans ce cas.
  2. Il le traite comme un type numérique plutôt que comme un varchar. Cela a également des implications sur les performances et pourrait effectivement casser la requête LIKE: je ne me souviens pas de ce que le comportement est hors de ma tête.

Essayez ceci:

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: ne pas que je vous donne ce code en premier lieu? :)

+0

ouais cela a fonctionné très bien alors j'ai eu l'idée de pouvoir rechercher par numéro de journal et écrou juste nom d'utilisateur et c'est quand j'ai commencé à avoir des problèmes parce que le numéro d'erreur est incorporé dans une chaîne. –

+0

Maintenant, j'obtiens ce message d'erreur Erreur Le type d'expression conditionnelle ne peut pas être déterminé car il n'y a pas de conversion implicite entre 'System.DBNull' et 'string' –

+0

D'oh! J'ai oublié la petite bizarrerie. C'est vrai que vous devez l'étendre dans une construction if/else plus longue plutôt que dans l'opérateur ternaire sympa et concis. –

1

ou si @ErrorMessage contient déjà le%, par ex. @ErrorMessage = « ABCD% » alors ce sera également travailler

... WHERE message like @ErrorMessage 
4

Vous êtes sur la bonne voie, mais l'utiliser de cette façon:

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


SELECT messageId FROM [yourTable] 
WHERE message like @ErrorMessage 

Sinon, le serveur ne sera pas en mesure de mettre en cache l'exécution plan

Questions connexes