Нужно ли добавлять @перед именем SqlParameter?
В одном из наших приложений параметры передаются в хранимую процедуру таким образом
Dim parm As New SqlParameter("searchText", SqlDbType.VarChar)
parm.Direction = ParameterDirection.Input
parm.Size = 50
parm.Value="test"
cmd.Parameters.Add(parm)
и процедура содержит параметр как @searchText
т.е. имя параметра, переданное из кода, является searchText
а в хранимой процедуре - @searchText
.
Но это работает правильно, я всегда получаю требуемые результаты.
Так что мой вопрос такой, что нет необходимости указывать @ перед параметром? Будет ли добавляться @, может кто-нибудь дать ответ на это.
Ответы
Ответ 1
Согласно документации, имя должно начинаться с @
:
ПараметрName указан в форме @paramname.
В соответствии с исходным кодом (посмотреть на SqlCommand
и SqlParameter.ParameterNameFixed
в опорном источнике), @
добавляется автоматически, если это необходимо.
Так что да, это работает, но это недокументированная функция. Лучшая практика рекомендует не полагаться на это и вручную префикс имени вашего параметра с помощью @
.
Ответ 2
Ссылка: свойство SqlParameter.ParameterName и свойство IDataParameter.ParameterName
ПараметрName указан в форме @paramname. Вы должны установить ParameterName перед выполнением SqlCommand, который опирается на параметры. Если вы используете Sql Server в качестве базы данных, вы должны указать @перед именем параметра.
ваше имя параметра должно быть таким же, как и в backend, например. у вас есть @searchText
тогда в спецификации вашего параметра он должен быть SqlParameter("@searchText"
..
ваш код должен быть таким
Dim parm As New SqlParameter("@searchText", SqlDbType.VarChar)
parm.Direction = ParameterDirection.Input
parm.Size = 50
parm.Value="test"
cmd.Parameters.Add(parm)
Примечание. Oracle и SqLite используют разные символы различного назначения, чтобы указать параметр, и может быть символ @не используется, указанный спецификацией ado.net.
Редактировать: По комментариям
Как вы указали ссылку, это также какое-то исправление, но в соответствии с документацией msdn вы должны указать позиционный параметр с помощью "@", используете ли вы какой-либо поставщик данных oledb, sql, odbc. ссылка
if (0 < parameterName.get_Length() && '@' != parameterName.get_Chars(0))
{
parameterName = "@" + parameterName;
}
Ответ 3
Не обязательно указывать @. Однако, это лучшая практика.
Его аналогично по аналогии со строками. Конечно, нет никакого вреда в определении строк как таковых в.NET:
string s;
//Rest of the code follows;
Но опять же, это лучшая практика, чтобы определить их как:
string s = string.Empty;
Понимаете, это вопрос об условностях и лучших практиках !!!
Ответ 4
Я рекомендовал вам использовать маркер "@" с вашим именем параметра. SqlParameter помогает автоматически добавлять, но параметр других может не совпадать.