2012-04-20 12 views
23

W jednej z naszych aplikacji parametry przekazane do procedury przechowywanej w ten sposóbCzy konieczne jest dodanie znaku @ przed nazwą parametru SqlParameter?

Dim parm As New SqlParameter("searchText", SqlDbType.VarChar) 
parm.Direction = ParameterDirection.Input 
parm.Size = 50 
parm.Value="test" 

cmd.Parameters.Add(parm) 

i procedury zawiera parametr jako @searchText

czyli nazwy parametru upłynął od kod jest searchText i że w procedura przechowywana to @searchText.

Ale działa poprawnie, zawsze otrzymuję wymagane wyniki.

Moje pytanie brzmi, więc nie ma potrzeby, aby przed parametrem podawać @? Czy będzie dołączać @, czy ktoś może dać odpowiedź na to.

Odpowiedz

22

Według to the documentation, nazwa musi zaczynać się @:

ParameterName jest określona w @paramname formularza.

Zgodnie z kodem źródłowym (spojrzeć SqlCommand i SqlParameter.ParameterNameFixed w źródło odniesienia), XVIII @ dodaje się automatycznie, w razie potrzeby.

Tak, działa, ale jest to nieudokumentowana funkcja. Najlepsza praktyka zaleca, aby nie polegać na tym i ręcznie prefiksować nazwę parametru za pomocą @.

+0

Mówi się, że automatycznie doda @ przed nazwą parametru. dobrze? –

+4

@mahesh: W obecnej wersji, o ile widzę, tak. Ponieważ jest to nieudokumentowana funkcja, może się ona zmienić w dowolnym momencie (na przykład w nowej wersji ramowej) bez powiadomienia. – Heinzi

+0

ok, dziękuję .. ale zastanawiam się, jak to się dzieje ... –

2

Ref: SqlParameter.ParameterName Property i IDataParameter.ParameterName Property

ParameterName jest określony w @paramname formy. Musisz ustawić ParameterName przed wykonaniem SqlCommand, który opiera się na parametrach. Jeśli używasz serwera SQL jako bazy danych, musisz podać @ przed nazwą parametru .

Twoja nazwa parametru musi być taka sama jak w backend, np. masz @searchText następnie w specyfikacji parametru musi być SqlParameter("@searchText" ..

Twój kod powinien być jak ten

Dim parm As New SqlParameter("@searchText", SqlDbType.VarChar) 
parm.Direction = ParameterDirection.Input 
parm.Size = 50 
parm.Value="test" 

cmd.Parameters.Add(parm) 

Uwaga: Oracle i SQLite użyć innego zastosowania inny charakter, aby określić parametr i nie może być symbol @ nie jest używane określone przez specyfikację ado.net.

Edit: Poprzez komentarze

Jak podano link, jest to również pewnego rodzaju poprawki, ale jak na dokumentacji MSDN, trzeba określić pozycyjny parametr „@”, czy przy użyciu dowolnego dostawcy danych oledb, sql, odbc. Ref

if (0 < parameterName.get_Length() && '@' != parameterName.get_Chars(0)) 
     { 
      parameterName = "@" + parameterName; 
     } 
+0

tak, wiem, że powinien to być @ searchText, ale moje pytanie brzmi, czy używam nazwy parametru searchtext, to również dostaję poprawne wyniki .. –

+0

Twoja odpowiedź mówi, że sprawa ma znaczenie w nazwie parametru. Czy tak właśnie jest? Wydaje mi się, że nie ma znaczenia, czy przypadki się zgadzają. –

+0

@Andrew Barber: Nie ma sprawy, ale przechodzi parametry bez @ na początku –

0

Nie jest konieczne podawanie @. Jednak jest to najlepsza praktyka.

Jest podobny w analogii do łańcuchów.Na pewno nie zaszkodzi w definiowaniu ciągów jako takie w .NET:

string s; 
//Rest of the code follows; 

Ale znowu, jest to najlepsza praktyka je zdefiniować jako:

string s = string.Empty; 

Widzisz, jest to kwestia konwencji, a najlepiej praktyki !!!

0

Zaleciłem użycie znacznika "@" z nazwą parametru. SqlParameter pomaga dodawać automatycznie, ale inne parametry mogą nie.

Powiązane problemy