Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中将参数添加到存储过程之间的区别?_Sql Server_Stored Procedures_Parameters_Ado.net - Fatal编程技术网

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代码中捕获,并且您将不会 等待往返

编辑

获取输出参数的示例:

C#

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)

使用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)