10
votes

Comment obtenir une clause comme fonctionner dans Ado.net et SQL Server

Je fais une requête vraiment simple dans asp.net, mais après avoir inséré la clause comme code>, il cesse de fonctionner.

Exemple: P>

String sql = " SELECT * 
                 FROM Products 
                WHERE ID = @MYID 
                  AND Name LIKE '%@MYNAME%' ";
SqlCommand command = new SqlCommand(sql, cn);


command.Parameters.AddWithValue("@MYID", MYID.Text);

command.Parameters.AddWithValue("@MYNAME", MYNAME.Text);


1 commentaires

Désolé, je devais éditer la question. il a renvoyé 0 résultat même si dans @myName j'ai fourni la chaîne partielle correcte


6 Réponses :


-15
votes

L'instruction SQL devrait ressembler à ceci: XXX

Je ne suis pas sûr que j'ai bien compris votre commentaire, mais il semble que vous souhaitiez utiliser la valeur d'une zone de texte dans votre requête - peut-être C'est ce que vous essayez de faire: xxx

"text_box" serait l'ID réel de votre contrôle de zone de texte.


3 commentaires

Cela n'a pas fonctionné :( J'ai essayé et imprimez le SQL voir ci-dessous: et nom comme '% System.web.ui.webcontrols.textbox%'


La concaténation des valeurs SQL String est fausse (même si elle fonctionne): mauvaises performances dues à aucune réutilisation du plan de requête, le risque d'injection SQL, comme indiqué précédemment.


Injection SQL possible



0
votes

ou xxx

et lorsque vous définissez le paramètre @myName, ajoutez les caractères "%" de manière appropriée (% Smith%). Je ne pense pas que vous avez besoin de citations simples lorsque vous traitez de paramètres.


0 commentaires

2
votes

Juste une note pour dire que l'utilisation d'une carte générique initiale est presque toujours une très mauvaise idée , car la requête n'utilise aucun index sur cette colonne. Dans ce cas, vous pouvez probablement vous échapper car il semble que le filtre sur la colonne ID vous limitera à un enregistrement, mais de manière générale de ce que vous devez faire à la place, il est placé à la place d'un index de texte intégral dans la colonne Nom et écrivez la requête comme Ceci: xxx


1 commentaires

True tant que le texte que vous recherchez est un mot complet (ou des mots) ou le début d'un mot. Si vous recherchez du texte au milieu de ou à la fin d'un mot, vous devez malheureusement utiliser comme% S% .



34
votes

Le code d'origine déroule le texte de l'instruction SQL avec le contenu du paramètre. Votre code devrait réellement ressembler à ceci:

string sql = "SELECT * 
              FROM Products 
              WHERE ID = @MyID
              AND Name LIKE @MyName";
using (SqlCommand command = new SqlCommand(sql, cn))
{
    command.Parameters.AddWithValue("@MyID", MyID.Text);
    command.Parameters.AddWithValue("@MyName", "%" + MyName.Text + "%");
    // Etc.
}


1 commentaires

Cela ne fonctionnera pas correctement lorsque le myName.text contient les caractères% _ ou [ en supposant que vous souhaitez réellement rechercher l'une de ces littéraux de Charater. Pour une solution à 100%, vous devez envelopper ces caractères entre crochets []. Le code C # Regex.replace (Searchstring, @ "([% _ \ [])", @ "[1 $]") fait le truc. Merci à Matt Miller pour pointer cette sortie ici .



-1
votes

Il vous manque le signe % en suivant la valeur de paramètre de passage xxx


1 commentaires

Pas correct, le nom du paramètre n'a aucune incidence sur le motif similaire. Cela devrait être appliqué à la valeur de paramètre.



0
votes

Ne pensez pas que l'utilisation d'un paramètre de liaison est comme l'insertion de sa valeur dans la chaîne SQL! Les valeurs de paramètres de liaison sont envoyées sous forme de données distinctes sur la base de données. Ils ne doivent donc pas être entre guillemets et ne peuvent pas non plus contenir de noms de code SQL, de table ou de colonne optionnels!


0 commentaires