Разница между добавлением параметров в хранимую процедуру в SQL Server 2005 - PullRequest
5 голосов
/ 27 марта 2011

Я хотел бы знать разницу между этими двумя обозначениями.

Прежде всего, у меня есть хранимая процедура

CREATE PROCEDURE AddSomething( @zonename varchar(50), @desc varchar(255), @TheNewId int OUTPUT ) AS 
BEGIN 
   INSERT INTO a_zone(zonename, descr) VALUES(@zonename, @desc) 
   SELECT @TheNewId = SCOPE_IDENTITY()         
END

Какая разница, если я добавлю параметры таким образом

SqlCommand Cmd = new SqlCommand("AddSomething", oConn); 
Cmd.CommandType = CommandType.StoredProcedure; 
SqlParameter oParam1 = Cmd.Parameters.AddWithValue("@zonename", sName);
SqlParameter oParam2 = Cmd.Parameters.AddWithValue("@desc", description);

и

SqlCommand Cmd2 = new SqlCommand("AddSomething", oConn); 
Cmd2.CommandType = CommandType.StoredProcedure;
cmd2.Parameters.Add("@zonename", SqlDbType.VarChar).Value = zonename.Text.Trim();
cmd2.Parameters.Add("@desc", SqlDbType.VarChar).Value = desc.Text.Trim();

Пожалуйста, помогите мне

Спасибо в ожидании

Ответы [ 2 ]

10 голосов
/ 27 марта 2011

Вот некоторые объяснения:

разница между командой Add и AddWithValue

Dim cmd as new SqlCommand("SELECT * FROM MyTable WHERE MyDate>@TheDate",conn)
cmd.Parameters.Add("@TheDate",SqlDbType.DateTime).Value="2/1/2007"

vs

cmd.Parameters.AddWithValue("@TheDate","2/1/2007")

"Добавить форсирует преобразованиеот строки к дате, когда она входит в параметр. AddWithValue просто передал бы строку в SQL Server.

При использовании Parameters.Add - S qlDbTypeis, известный во время компиляции

При использовании Parameters.AddWithValue метод должен пометить и распаковать значение, чтобы выяснить его тип.

Дополнительные преимущества первого: Add немного более безопасен для кода и поможет против внедрения SQLатаки, используйте безопасный код с точки зрения того, что если вы попытаетесь передать значение, которое не соответствует определенному типу sqldb - ошибка будет обнаружена в коде .Net, и вам не придется ждать возврата туда и обратно.

Редактировать :

пример для получения выходного параметра:

C #

cmd.Parameters.Add(new SqlParameter("@TheNewId", SqlDbType.Int, int.MaxValue));
cmd.Parameters("@TheNewId").Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
int theNewID = (int)cmd.Parameters("@TheNewId").Value;

VB.Net

cmd.Parameters.Add(New SqlParameter("@TheNewId", SqlDbType.Int, Int32.MaxValue))
cmd.Parameters("@TheNewId").Direction = ParameterDirection.Output
cmd.ExecuteNonQuery()
Dim theNewID As Int32 = DirectCast(cmd.Parameters("@TheNewId").Value, Int32)
6 голосов
/ 27 марта 2011

Когда вы используете AddWithValue, тип данных будет обработан (как можно лучше) на основе типов переменных, переданных методу - при условии, что sName и description являются строковыми переменными, параметры будут переданы как NVARCHAR.

Лично я предпочитаю 2-й подход, поскольку он явно относится к типам данных (плюс я на самом деле также указываю размеры), чтобы они гарантированно соответствовали определению sproc и избегали неожиданного поведения.

...