在SQL Server 2005中向存储过程添加参数之间的区别

Sre*_*ree 5 parameters ado.net stored-procedures sql-server-2005

我想知道这两个符号之间的区别.

首先,我有一个存储过程

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
Run Code Online (Sandbox Code Playgroud)

如果我以这种方式添加参数有什么区别

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

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();
Run Code Online (Sandbox Code Playgroud)

请帮我

谢谢你的期待

Tim*_*ter 10

以下是一些解释:

命令Add和AddWithValue之间的区别

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

VS

cmd.Parameters.AddWithValue("@TheDate","2/1/2007")
Run Code Online (Sandbox Code Playgroud)

"当进入参数时,Add强制从字符串到日期的转换.AddWithValue只是将字符串传递给SQL Server.

使用时Parameters.Add- 在编译时已知S qlDbType

当使用Parameters.AddWithValue该方法时,必须对该值进行框和取消装箱以找出它的类型.

前者的其他好处是Add代码安全性更高,并且有助于防止SQL注入攻击,代码安全,如果您尝试传递与定义的sqldb类型不匹配的值,则会捕获错误.网络代码,你不必等待往返回程.

编辑:

获取输出参数的示例:

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;
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)


Ada*_*Dev 6

当您使用AddWithValue时,将根据传递给方法的变量类型计算出数据类型(尽可能最好) - 假设sName和description是字符串变量,params将作为NVARCHAR传入.

我个人更喜欢第二种方法,明确使用数据类型(我实际上也指定了大小),以保证它们与sproc定义匹配并避免任何意外行为.