В чем разница с или без начального (@) для параметра команды в 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,

Другие вопросы по тегам