[英]C# TSQL Stored Procedure don't pass parameter?
我不知道此查询是否值得询问,但是最好了解什么行得通,行不通以及原因。
我有一个这样的表,叫做tbl_Person_Details
:
ID | Name | Likes
-----------------
0 | Jon | Fish
1 | Doey | Coding
这样的代码(示例显示了两个功能,但可能还有更多功能):
public void updatePerson()
{
string sID = GridView1.SelectedDataKey[0].ToString();
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
con.Open();
SqlCommand comm = new SqlCommand("spUpdatePersonBasics", con);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@Name", tbName.Text.ToString()));
comm.Parameters.Add(new SqlParameter("@ID", sID));
object tmp = comm.ExecuteScalar();
con.Close();
lblStatus.Text = "<img src=\"img/icons/green-tick.gif\" /> <strong>>Person Details have been updated!</strong>";
}
public void updatePersonLikes()
{
string sID = GridView1.SelectedDataKey[0].ToString();
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
con.Open();
SqlCommand comm = new SqlCommand("spUpdatePersonBasics", con);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@Likes", tbName.Text.ToString()));
comm.Parameters.Add(new SqlParameter("@ID", sID));
object tmp = comm.ExecuteScalar();
con.Close();
lblStatus.Text = "<img src=\"img/icons/green-tick.gif\" /> <strong>>Person likes have been updated!</strong>";
}
存储过程:
ALTER PROCEDURE [dbo].[spUpdatePersonBasics]
@ID int,
@Name varchar(50),
@Likes varchar(50)
AS
UPDATE tbl_Person_Details
SET Name = @Name,
Likes = @Likes
WHERE ID = @ID
SELECT CAST(scope_identity() AS int)
问题:
正如我们所看到的,到目前为止一切正常。 但是,在调试时,我们会遇到多种导致问题的情况。 这些如下:
我认为这里的设计不好,但是我认为唯一可行的解决方案是拥有多个存储过程,即每个功能一个。 任何想法,如果这是最好的方法,并且是否健壮?
我真正需要的是不更新某些列(如果它们已经存在)。 例如,当我更新Likes时,我不想更新该行的名称。
如果不想更新它,则可以只为两个值之一传递NULL
,然后将存储过程修改为:
ALTER PROCEDURE [dbo].[spUpdatePersonBasics]
@ID int,
@Name varchar(50),
@Likes varchar(50)
AS
UPDATE tbl_Person_Details
SET Name = ISNULL(@Name, Name)
Likes = ISNULL(@Likes, Likes)
WHERE ID = @ID
所以,如果你在通过@Name = NULL
,则UPDATE
将基本上更新Name
,它的值Name
-一个“不更新”的,真的。
要从C#传递NULL,请使用DBNull.Value
:
comm.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = DBNull.Value;
我选择使用.Add()
方法,并且选择为参数(包括基于字符串的参数的长度)明确指定SqlDbType
。
如果您想传递参数-只需使用以下命令:
comm.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = tbName.Text;
由于.Text
属性已经是string
,因此在其上调用.ToString()
确实没有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.