Подтвердить что ты не робот

Разница между 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

Я не получаю компиляционную ошибку и даже более странную, все, кажется, работает правильно, когда код выполняется?

4b9b3361

Ответ 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 требует, чтобы вы сначала указали тип базы данных. Это помогает уменьшить такие ошибки.

Для более подробной информации, пожалуйста, нажмите здесь