繁体   English   中英

C#TSQL存储过程不传递参数?

[英]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)

问题:

正如我们所看到的,到目前为止一切正常。 但是,在调试时,我们会遇到多种导致问题的情况。 这些如下:

  1. 在我的函数后面的代码上,即使有时仅想更新一个参数,我也必须声明所有参数。
  2. 如果我们为实例添加一个名为“标题”的新列,并且前端HTML有一个下拉列表。 我们可以在后面的代码中进行更新,方法是在存储过程中再增加一行,并在任何函数中增加一行参数。 但是因为现在存储过程将具有一个新参数,然后在函数后面的代码中不更新“标题”,所以将得到一个SQL Exception错误,因为我们没有通过给定的函数将数据提供回存储过程。

我认为这里的设计不好,但是我认为唯一可行的解​​决方案是拥有多个存储过程,即每个功能一个。 任何想法,如果这是最好的方法,并且是否健壮?

我真正需要的是不更新某些列(如果它们已经存在)。 例如,当我更新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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM