В чем разница с или без начального (@) для параметра команды в C#
Какая разница с или без главного героя (@
или же :
) в имени параметра SqlCommand в C#?
command.CommandText = "SELECT * FROM myTable WHERE name = @myName";
command.Parameters.Add(new SqlParameter("@myName", "bob"));
Но это нормально
command.Parameters.Add(new SqlParameter("myName", "bob"));
даже это работает
command.Parameters.Add("myName", "bob");
Я не тестировал второй, но вижу их все в интернете.
Я пробовал против Oracle, и оба работали, с или без :
,
Так что лучше или они одинаковые?
2 ответа
@
добавляется автоматически, если вы его не указали. Проверьте исходный код здесь:
internal string ParameterNameFixed {
get {
string parameterName = ParameterName;
if ((0 < parameterName.Length) && ('@' != parameterName[0])) {
parameterName = "@" + parameterName;
}
Debug.Assert(parameterName.Length <= TdsEnums.MAX_PARAMETER_NAME_LENGTH, "parameter name too long");
return parameterName;
}
}
Это свойство используется при генерации строки запроса SQL для вашей команды.
@
перед параметром сообщает интерпретатору sql, что это параметр и ничего больше.
Если вы пропустите это, это может сработать, потому что может быть неоднозначность между именем столбца и именем параметра.
В твоем случае:
SELECT * FROM myTable WHERE name = @myName
будет работать правильно, даже если у вас есть столбец с именем myName
, но это:
SELECT * FROM myTable WHERE name = myName
не будет работать, так как интерпретатор sql запутался, обращаетесь ли вы к столбцу myName
или параметр myName
,