2011-02-10 11 views
9

mam problem z przygotowaną instrukcję w języku C#:C# sporządziły sprawozdania - znak @ (w/strudel znaku) odpytuje

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?"; 
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email; 

(oczywiście e-mail zawiera adres e-mail, ze znakiem @).

Ten kod zwraca błąd losowy -

"Połączenie zostało wyłączone" { "BŁĄD [01000] [Microsoft] [ODBC SQL Server Driver] [TCP/IP Gniazdka] ConnectionWrite (send()). eRROR [08S01] [Microsoft] [ODBC SQL Server Driver ] [TCP/IP Sockets] Ogólne błąd sieci. Sprawdź w dokumentacji sieci . "}

Howeve r jeśli uruchomię swój kod bez przygotowanego wyciągu, co oznacza:

cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = '"+email+"'"; 

Wszystko działa idealnie.

Być może jest to związane z tym, że mam znak @ w parametryzowanej wartości? Mam wrażenie, że nie jestem pierwszym, który próbuje stworzyć przygotowane oświadczenie z adresem e-mail ...

Nie mam pojęcia, co jest nie tak! Inne przygotowane instrukcje działają normalnie ...

Czy możesz pomóc? :) Dzięki, Nili

+1

Hmm. Kiedy wykonuję przygotowane instrukcje, używam nazwanych parametrów. Coś w zakresie 'WYBIERZ * od tabeli WHERE id = @ id', a następnie wywołaj' .Parameters.Add ("@ id", e-mail); '- Wypróbuj to, zobacz czy działa – Zack

Odpowiedz

7

Rzeczywiście, ODBC ma swój udział w problemach z obsługą nazwanych parametrów. Możliwe jest jednak pewne użycie nazwanych parametrów.

Na przykład, w przypadku następujących składnia działa:?

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?"; 
cmd.Parameters.Add("USER_ID", OdbcType.VarChar, 250).Value = email; 

bardziej skomplikowane sytuacja jest wtedy, gdy nie masz niepowtarzalną mecz dla parametru jak USER_ID =; na przykład, jeśli chcesz użyć operatora IN w klauzuli WHERE.

Wtedy następująca składnia będzie wykonać zadanie:

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID IN (?, ?)"; 
cmd.Parameters.Add("?ID1", OdbcType.VarChar, 250).Value = email1; 
cmd.Parameters.Add("?ID2", OdbcType.VarChar, 250).Value = email2; 

Zwróć uwagę wykorzystanie ? (znak zapytania) zamiast @ (przy znaku) w nazwie parametru. Chociaż należy zauważyć, że zastąpienie wartości parametrów w tym przypadku nie ma nic wspólnego z ich nazwami, ale tylko z ich kolejnością z kolekcją parametrów.

Mam nadzieję, że to pomoże :-)

+0

Błąd przydziału pamięci – donstack

+0

@donstack Po wykonaniu której linii dokładnie otrzymasz błąd przydziału pamięci? Jaki to błąd - wyjątek? – Lev

+0

Dziękuję. Przejście z Java do C# i próba zrozumienia przygotowanych oświadczeń była zaskakująco trudna. To doskonale tłumaczy podobne podejście do Javy, w dolnym przykładzie. Uff ... – KjetilNordin

2

Użyj "@USER_ID" zamiast "?" i wszystko powinno działać:

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = @USER_ID"; 
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email; 
+0

Składnia znaku zapytania działa w wszystkie inne miejsca. Ponadto próbowałem użyć sugerowanej składni i otrzymałem nowy błąd - "ERROR [42000] [Microsoft] [Sterownik ODBC SQL Server] [Serwer SQL] Należy zadeklarować zmienną skalarną" @USER_ID "." – Nili

3

Czy istnieje konkretny powód używasz OdbcCommand zamiast używać dostawcy SqlClient?

Z dostawcą SqlClient powinieneś używać nazwanych parametrów, jak sugerowali inni.

Ale according to MSDN:

Usługodawca Framework danych dla OLE DB i dostawca danych .NET Framework dla ODBC nie obsługuje nazwanych parametrów dla przekazywania parametrów do SQL lub procedury przechowywanej. W takim przypadku należy użyć znaku zastępczego znaku zapytania (?), Jak w poniższym przykładzie.

Nie jestem pewien, czy parametry nazwane będą działać w tym przypadku.

+0

Składnia znaku zapytania działa we wszystkich innych miejscach. Ponadto próbowałem użyć sugerowanej składni i otrzymałem nowy błąd - "ERROR [42000] [Microsoft] [Sterownik ODBC SQL Server] [Serwer SQL] Należy zadeklarować zmienną skalarną" @USER_ID "." – Nili