【发布时间】:2016-04-04 08:50:34
【问题描述】:
我不知道这个查询是否值得询问,但最好了解什么有效,什么无效以及为什么。
我有一张这样的表,叫做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)
问题:
到目前为止,我们可以看到一切都很好。但是,在调试时,我们可能会遇到多种导致问题的场景。这些如下:
- 在函数后面的代码中,即使有时我只想更新一个参数,我也必须声明所有参数。
- 如果我们添加一个名为“标题”的新列,并且前端 HTML 有一个下拉列表。我们可以通过在我们的存储过程中再添加一行和对任何函数添加一行参数来更新我们的代码。但是因为现在存储过程将有一个新参数,然后在我们没有更新“标题”的函数后面的代码中,我们将收到 SQL 异常错误,因为我们没有通过这个给定的函数将数据提供回存储过程。李>
我认为这里的设计很糟糕,但我认为唯一可能的解决方案是拥有多个存储过程,即每个函数一个。如果这是最好的方法并且它是否健壮,有什么想法吗?
如果某些列已经存在,我真正需要的是不要更新它们。例如,当我更新 Likes 时,我不想更新行的名称。
【问题讨论】:
-
一个
UPDATE操作从不插入一个新行,因此在UPDATE之后调用SCOPE_IDENTITY将NOT返回任何有意义的东西。 ...(它将在此上下文中返回最后一个身份值 inserted - 但没有任何内容被 inserted......) -
谢谢@marc_s,如果它根本没有用,我会删除它。
标签: c# sql-server tsql stored-procedures parameters