2010-04-07 7 views
8

Wykonuję naprawdę proste zapytanie w ASP.NET, ale po tym, jak wstawiłem klauzulę LIKE przestaje działać.jak uzyskać klauzulę LIKE do pracy w ADO.NET i SQL Server

przykład:

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

Jeśli usunięty JAK działa. Dlatego myślę, że ma to związek z "cytatami"?

+0

Przepraszam, musiałem edytować pytanie. Zwrócił wynik 0, mimo że w @MYNAME podałem poprawny łańcuch częściowy – noobplusplus

Odpowiedz

-12

SQL oświadczenie powinno wyglądać następująco:

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + @MYNAME + '%'"; 

nie jestem pewien, że zrozumiał swój komentarz całkowicie, ale wydaje chcesz użyć wartości z pola tekstowego w zapytaniu - może to właśnie próbujesz zrobić:

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + text_box.Text + '%'"; 

"text_box" byłby faktycznym identyfikatorem twojej kontrolki textBox.

+0

, który nie działał :(próbowałem go i wydrukowałem sql, patrz poniżej: I NAZWA JAK "% System.Web.UI.WebControls.TextBox % ' – noobplusplus

+15

-1 dla podatności na atak SQL injection – Aaronaught

+2

Łączenie łańcuchów wartości SQL jest NIEPRAWIDŁOWE (nawet jeśli działa): zła wydajność spowodowana brakiem ponownego użycia planu kwerendy, ryzyko wstrzyknięcia SQL, jak już powiedziano, –

0

Albo

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE @MYNAME "; 

i po ustawieniu parametru @MYNAME, dodać "%" znaków odpowiednio (% SMITH%). Nie sądzę, że potrzebujesz pojedynczych cytatów, gdy masz do czynienia z parametrami.

1

Wystarczy napisać, że używanie LIKE z początkowym symbolem wieloznacznym prawie zawsze jest bardzo złym pomysłem, ponieważ zapytanie nie będzie używać żadnych indeksów w tej kolumnie. W tym przypadku prawdopodobnie możesz uciec, ponieważ wygląda na to, że filtr w kolumnie ID ograniczy cię do jednego rekordu, ale generalnie musisz zamiast tego umieścić indeks pełnotekstowy na kolumnie nazwy i napisać zapytanie takie jak to:

... WHERE CONTAINS(name, @MyName) 
+0

Prawda tak długo, jak tekst "Szukanie jest pełne słowo (lub słowa) lub początek słowa .Jeśli szukasz tekstu w środku lub na końcu słowa, niestety nadal trzeba użyć' LIKE% s% ' . – Aaronaught

26

Oryginalny kod mylony jest z tekstem instrukcji SQL z zawartością parametru. Kod powinien faktycznie wyglądać następująco:

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

W % znaki muszą być częścią wartości parametru, a ty nie potrzebujesz apostrofów w ogóle podczas korzystania wiążących parametry.

+1

To nie będzie działać poprawnie, gdy MyName.Tekst zawiera znaki% _ lub [, zakładając, że chcesz wyszukać jeden z tych znaków literowych. Aby uzyskać rozwiązanie w 100%, musisz zawinąć je w nawiasy kwadratowe []. Kod C# 'Regex.Replace (searchString, @" ([% _ \ []) ", @" [$ 1] ") robi lewę. Podziękowania dla Matta Millera za wskazanie tego [tutaj] (http://stackoverflow.com/questions/665129/use-of-sqlparameter-in-sql-like-clause-not-working). – Dejan

-1

brakuje znaku % przechodząc wartość parametru

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

Nieprawidłowe, nazwa parametru nie ma żadnego wpływu na wzór LIKE. To powinno być zastosowane do wartości parametru. – Lankymart

0

Nie myśl, że za pomocą parametru wiązania jest jak wstawienie jego wartość w ciągu SQL! Wartości parametrów wiązania są wysyłane jako osobne dane do bazy danych, więc nie mogą być w cudzysłowach i nie mogą zawierać żadnych opcjonalnych nazw kodu SQL, tabeli lub kolumny!

Powiązane problemy