2011-03-26 80 views
5

我想知道这两个符号之间的区别。将参数添加到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 

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

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(); 

请帮我

感谢预期

回答

9

这里有一些解释:

difference between command Add and 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) 
+0

@Tim所以你的意思是这两种方法都用于将参数传递到存储过程中。 – 2011-03-26 22:28:21

+1

@ user653622:是的,但不仅适用于存储过程,而且适用于各种sql-command。他们都有优点和缺点(见链接)。 – 2011-03-26 22:30:00

+0

@Tim我怎样才能使用第二种方法来传递输出类型参数,特别是当我没有任何值传递时,而是我期待存储过程中的值。具体在这种情况下cmd2.Parameters.Add(“@ TheNewId”,SqlDbType.Int).Value = ???;如果我使用第二种方法,它会期待一个值,但我必须明确地告诉它不要期望输出参数的值,我该如何告诉它?请帮助我 – 2011-03-26 22:41:38

5

当您使用AddWithValue,数据类型将制定出(如最佳)的基础上的类型传递给方法的变量 - 假定SNAME和描述字符串变量,参数将作为NVARCHAR传入。

我个人更喜欢第二种方法,明确了数据类型(加上我实际指定了尺寸),以保证它们与存储区定义匹配并避免任何意外行为。

+0

+1正好 - 而不是让太多的“魔术”决定你的类型。另外:如果您需要通过例如'DBNull.Value' - ADO.NET运行时如何能够找出你的“NULL”将会是什么类型!?!?!明确表示 - 多打一点,但更安全和清晰(想想:维护!) – 2011-03-27 08:24:47