2010-05-22 6 views
1

Dans ma requête SQL, j'utilise des caractères génériques. Mais quand j'essaie de sélectionner quelque chose, il ne sélectionne jamais quelque chose. Alors que lorsque j'exécute la requête dans Microsoft SQL Server Management Studio, cela fonctionne très bien. Qu'est-ce que je fais de mal?Caractères génériques dans les paramètres T-SQL LIKE vs. ASP.net

gestionnaire Cliquez

protected void btnTitelAuteur_Click(object sender, EventArgs e) 
{ 
    cvalTitelAuteur.Enabled = true; 
    cvalTitelAuteur.Validate(); 

    if (Page.IsValid) 
    { 
     objdsSelectedBooks.SelectMethod = "getBooksByTitleAuthor"; 
     objdsSelectedBooks.SelectParameters.Clear(); 
     objdsSelectedBooks.SelectParameters.Add(new Parameter("title", DbType.String)); 
     objdsSelectedBooks.SelectParameters.Add(new Parameter("author", DbType.String)); 
     objdsSelectedBooks.Select(); 
     gvSelectedBooks.DataBind(); 

     pnlZoeken.Visible = false; 
     pnlKiezen.Visible = true; 
    } 
} 

Dans mon accès aux données couche

Répondre

6

Essayez ceci:

string sql = "SELECT 'AUTHOR' = tblAuthors.FIRSTNAME + ' ' + tblAuthors.LASTNAME, tblBooks.*, tblGenres.GENRE " 
      + "FROM tblAuthors INNER JOIN tblBooks ON tblAuthors.AUTHOR_ID = tblBooks.AUTHOR_ID INNER JOIN tblGenres ON tblBooks.GENRE_ID = tblGenres.GENRE_ID " 
      +"WHERE (tblBooks.TITLE LIKE @title);"; 

SqlDataAdapter da = new SqlDataAdapter(sql, GetConnectionString()); 
da.SelectCommand.Parameters.Add("@title", SqlDbType.Text); 
da.SelectCommand.Parameters["@title"].Value = "%" + title + "%"; 
+0

Merci. Cela marche. – Vinzcent

1

Vous ne pouvez pas inclure votre paramètre de requête dans une chaîne littérale. Procédez comme suit:

OERE (tblBooks.TITLE LIKE '%' + @title + '%');

De plus, chaque fois que vous avez un caractère générique de premier plan, vous devriez regarder dans un index de texte intégral à la place. Votre requête écrite est condamnée à être beaucoup plus lente qu'elle ne pourrait l'être, parce que vous ne pouvez pas utiliser l'index quand vous avez un caractère générique principal.

+0

Merci pour votre réponse. J'ai changé la clause were pour votre code. Mais maintenant j'ai ceci: Les types de données varchar et text sont incompatibles dans l'opérateur add. Je suppose qu'il n'y a pas de guillemets autour du @ titre. Mais quand je mets des guillemets autour de ça, ça ne marche toujours pas. Vincent – Vinzcent

+0

@Vin Ah, votre problème est le type de données texte. Le type de données de type texte est exclusivement réservé aux champs de données volumineux qui, autrement, entraîneraient des problèmes avec la limite de 8192 octets par ligne de SQL Server. Vous devez utiliser un champ nvarchar pour cette colonne à la place. –

1

La réponse de John Allers est correcte. En aparté, vous devriez envelopper le SqlDataAdapter dans un bloc using:

using (SqlDataAdapter da = new SqlDataAdapter(sql, GetConnectionString())) 
{ 
    da.SelectCommand.Parameters.Add("@title", SqlDbType.Text); 
    da.SelectCommand.Parameters["@title"].Value = title; 

    DataSet ds = new DataSet(); 
    da.Fill(ds, "Books"); 

    return ds.Tables["Books"]; 
} 
Questions connexes