Разница между Parameters.Add (строка, объект) и Parameters.AddWithValue
Я прочитал документацию MSDN и примеры здесь, и я знаю, что правильный синтаксис для вызова Paramters.Add
:
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID;
Если вам нужно указать имя параметра, SqlDbType
И значение с .Value
.
Теперь правильный синтаксис для вызова Parameters.AddWithValue
:
command.Parameters.AddWithValue("@demographics", demoXml);
Одиночная строка и пропустите часть Type
.
Мой вопрос: как это происходит, когда я делаю это так,
command.Parameters.Add("@demographics", demoXml);
// .Add method with .AddWithValue syntax
Я не получаю компиляционную ошибку и даже более странную, все, кажется, работает правильно, когда код выполняется?
Ответы
Ответ 1
Нет никакой разницы в функциональности. Фактически, оба делают это:
return this.Add(new SqlParameter(parameterName, value));
Причина, по которой они устарели в пользу AddWithValue
, заключается в добавлении дополнительной ясности, а также потому, что второй параметр object
, что делает его не сразу очевидным для некоторых людей, перегрузка которых была Add
и они привели к совершенно другому поведению.
Взгляните на этот пример:
SqlCommand command = new SqlCommand();
command.Parameters.Add("@name", 0);
На первый взгляд похоже, что он вызывает перегрузку Add(string name, object value)
, но это не так. Он вызывает перегрузку Add(string name, SqlDbType type)
! Это связано с тем, что 0 неявно конвертируется в типы перечисления. Итак, эти две строки:
command.Parameters.Add("@name", 0);
и
command.Parameters.Add("@name", 1);
На самом деле вызывать два разных метода. 1
неявно конвертируется в перечисление, поэтому выбирает перегрузку object
. С помощью 0
он выбирает перегрузку перечисления.
Ответ 2
Разница заключается в неявном преобразовании при использовании AddWithValue. Если вы знаете, что ваш исполняемый SQL-запрос (хранимая процедура) принимает значение типа int, nvarchar и т.д., Нет причин повторного объявления его в вашем коде.
Для сценариев сложного типа (пример будет DateTime, float), я, вероятно, буду использовать Add, поскольку он более явный, но AddWithValue для более простых типов сценариев (Int to Int).
Ответ 3
Без явного указания типа, как в command.Parameters.Add("@ID", SqlDbType.Int);
, он попытается неявно преобразовать вход в то, что он ожидает.
Недостатком этого является то, что неявное преобразование может быть не самым оптимальным из преобразований и может привести к поражению производительности.
Здесь обсуждается эта тема:
http://forums.asp.net/t/1200255.aspx/1
Ответ 4
когда мы используем CommandObj.Parameter.Add(), он принимает 2 параметра, сначала параметр процедуры, а второй - его тип данных, но .AddWithValue() принимает 2 параметра, сначала параметр процедуры, а второй - переменную данных
CommandObj.Parameter.Add("@ID",SqlDbType.Int).Value=textBox1.Text;
//для .AddWithValue
CommandObj.Parameter.AddWitheValue("@ID",textBox1.Text);
где ID - это параметр хранимой процедуры, тип данных которой является Int
Ответ 5
Там нет никакой разницы с точки зрения функциональности
Метод addwithvalue
принимает объект в качестве значения. Нет проверки типа данных. Потенциально это может привести к ошибке, если тип данных не совпадает с таблицей SQL. Метод add
требует, чтобы вы сначала указали тип базы данных. Это помогает уменьшить такие ошибки.
Для более подробной информации, пожалуйста, нажмите здесь