2012-12-19 7 views
7

Mam DB postgresql i chcę kwerendy tabeli "Lokalizacje", aby pobrać nazwy wszystkich lokalizacji, które pasują do nazwy wprowadzone przez użytkownika. Nazwa kolumny to "LocationName". Używam ASP.net z C#.podobne oświadczenie dla npgsql przy użyciu parametru

NpgsqlConnection con = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ToString()); 

NpgsqlCommand cmd = new NpgsqlCommand("Select * from \"Locations\" where \"LocationName\" LIKE \"%@loc_name%\"", con); 

cmd.Parameters.AddWithValue("@loc_name", Location_Name); 

NpgsqlDataReader reader = cmd.ExecuteReader(); 

otrzymuję ten wyjątek:

Npgsql.NpgsqlException: ERROR: 42703: column "%((E'My place'))%" does not exist 

próbowałam uruchomieniem kwerendy bez użycia%, ale to nie działa. Ja również próbowałem za pomocą + i & jak podano poniżej, ale to nie działa albo:

string query = "Select \"LocationName\" from \"Locations\" where \"LocationName\" LIKE '%'+ :loc_name +'%'"; 

z powyższej linii, otrzymuję ten wyjątek:

Npgsql.NpgsqlException: ERROR: 42725: operator is not unique: unknown + unknown 
+0

Dla ciebie ostatnie zapytanie: Postgres używa operatora || do łączenia łańcuchów, a nie do znaku plus (+). – alfoks

Odpowiedz

12

trzeba zastosować

NpgsqlCommand cmd = new NpgsqlCommand("Select * from \"Locations\" where \"LocationName\" LIKE @loc_name", con); 
cmd.Parameters.AddWithValue("@loc_name", "%" + Location_Name + "%"); 

Wstawiasz za dużo cytatów: Postgre interpretuje ciąg znaków między podwójnym cudzysłowie jako pole/nazwa tabeli. Pozwól, aby parametr wykonywał ciąg znaków ucieczkowych

P.S .: Aby połączyć łańcuch w Postgre, powinieneś użyć operatora ||, patrz here. Tak więc ostatnie zapytanie powinno być

string query = "Select \"LocationName\" from \"Locations\" where \"LocationName\" LIKE '%' || :loc_name || '%'"; 
+0

Zadziałało! Teraz zwraca wszystkie pasujące wiersze. Dzięki @trippino za pomoc i za tak szybką odpowiedź. – Namrata

+0

Cieszę się, że mogę Ci pomóc. Witamy w przepełnieniu stosu :) –