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
以下是一些解释:
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)
当您使用AddWithValue时,将根据传递给方法的变量类型计算出数据类型(尽可能最好) - 假设sName和description是字符串变量,params将作为NVARCHAR传入.
我个人更喜欢第二种方法,明确使用数据类型(我实际上也指定了大小),以保证它们与sproc定义匹配并避免任何意外行为.