Sql server 在SQL Server中将参数添加到存储过程之间的区别?
我想知道这两种符号之间的区别 首先,我有一个存储过程Sql server 在SQL Server中将参数添加到存储过程之间的区别?,sql-server,stored-procedures,parameters,ado.net,Sql Server,Stored Procedures,Parameters,Ado.net,我想知道这两种符号之间的区别 首先,我有一个存储过程 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() EN
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);
及
以下是一些解释: vs “Add强制将字符串转换为参数中的日期。AddWithValue只需将字符串传递给SQL Server即可 使用
参数.Add
时,SqlDbType在编译时已知
使用Parameters.AddWithValue
时,该方法必须对值进行装箱和取消装箱,以确定其类型
前者的其他好处是Add
更安全一些
并将有助于抵御SQL注入攻击,代码安全
如果您试图传递与SqlDb类型不匹配的值
已定义-错误将在.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)
使用AddWithValue时,将根据传递给方法的变量类型计算数据类型(尽可能好)——假设sName和description是字符串变量,则参数将作为NVARCHAR传递
我个人更喜欢第二种方法,即明确数据类型(加上我实际上也指定了大小)因此,它们保证与存储过程定义匹配并避免任何意外行为。@Tim so u的意思是这两种方法都用于将参数传递到存储过程中。@user653622:是的,但不仅适用于存储过程,而且适用于每种sql命令。它们都有优点和缺点(请参阅链接).@Tim如何使用第二种方法传递输出类型参数,特别是当我没有任何要传递的值,而是希望从存储过程中获得一个值时。在本例中,特别是cmd2.parameters.Add(“@TheNewId”,SqlDbType.Int).Value=???;如果我使用第二种方法,它将需要一个值,但我必须明确告诉它不需要一个值或一个输出参数,我应该如何告诉它?请帮助me@Tim您的示例在asp.net/c中不起作用,因为SqlParameter没有重载方法。相反,此过程可用于SqlParameter outputParameter1=new SqlParameter(“@NewIntId”,SqlDbType.Int);outputParameter1.Direction=ParameterDirection.Output;cmd2.Parameters.Add(outputParameter1);cmd2.ExecuteNonQuery();Int valueFromOutputParameter=(Int)cmd2.Parameter[“@NewIntId”].Value+1精确-最好是显式的,不要太“魔术”“确定你的类型。另外:如果您需要传入,例如,
DBNull.Value
-ADO.NET运行时如何才能确定您的“NULL”将是什么类型!?!?!明确一点——多输入一点点,但要更加安全和清晰(想想:维护!)
Dim cmd as new SqlCommand("SELECT * FROM MyTable WHERE MyDate>@TheDate",conn)
cmd.Parameters.Add("@TheDate",SqlDbType.DateTime).Value="2/1/2007"
cmd.Parameters.AddWithValue("@TheDate","2/1/2007")
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;
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)