Sql server 具有多个参数但可以插入所需参数的存储过程
SQL Server存储过程:Sql server 具有多个参数但可以插入所需参数的存储过程,sql-server,Sql Server,SQL Server存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[sp_Update_User] @usr_ID int, @usr_Name nvarchar(50), @usr_Username nvarchar(25), @usr_Password nvarchar(25), @usr_CNIC nvarchar(15), @usr
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_Update_User]
@usr_ID int,
@usr_Name nvarchar(50),
@usr_Username nvarchar(25),
@usr_Password nvarchar(25),
@usr_CNIC nvarchar(15),
@usr_Phone nvarchar(13),
@usr_Address nvarchar(100),
@usr_DateTime datetime,
@usr_Role_FK int,
@usr_Status bit
AS
BEGIN
UPDATE tbl_Users
SET usr_Name = @usr_Name,
usr_Username = @usr_Username,
usr_Password = @usr_Password,
usr_CNIC = @usr_CNIC,
usr_Phone = @usr_Phone,
usr_Address = @usr_Address,
usr_DateTime = @usr_DateTime,
usr_Role_FK = @usr_Role_FK,
usr_Status = @usr_Status
WHERE usr_ID = @usr_ID
END
我的C#代码:
LetsCRUD
code:
public static int LetsCRUD(string procedureName, Hashtable ht)
{
int result = 0;
try
{
SqlCommand cmd = new SqlCommand(procedureName, con);
cmd.CommandType = CommandType.StoredProcedure;
foreach (DictionaryEntry item in ht)
{
cmd.Parameters.AddWithValue(item.Key.ToString(), item.Value);
}
con.Open();
result = cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception ex)
{
con.Close();
ShowMSG(ex.Message, "Error", "Error");
}
return result;
}
问题是,我想在更新时使用相同的逻辑和代码,只想更新一列,不想再次传递所有值,但当我传递一个值时,会出现错误
因此,现在我只想更新我的电话号码您可以使用NULL作为输入参数的默认值。 缺点是,当您真的需要将值更新为NULL时,这有点麻烦(您可以使用其他默认值或将其他值转换为NULL,例如emtpy字符串或0表示NULL,这取决于您的情况)
旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp.
并使用其他东西作为前缀,或者根本不使用前缀!非常感谢你,以后我将永远不用它。真的很感谢你的关联-不要使用,所以你的意思是说,当只更新一个值时,此方法不会更新其他值?最终结果将只有一个更改的值,在幕后所有其他值/列将更新为其现有值。如果有更新触发器,则看起来每个列都已被修改。注意这个方法。鼓励应用程序开发人员的懒惰可能会导致问题。当有人想要“删除”一个像电话号码这样的值时会发生什么。GUI是如何处理的,它在表中应该有什么效果?
public static int LetsCRUD(string procedureName, Hashtable ht)
{
int result = 0;
try
{
SqlCommand cmd = new SqlCommand(procedureName, con);
cmd.CommandType = CommandType.StoredProcedure;
foreach (DictionaryEntry item in ht)
{
cmd.Parameters.AddWithValue(item.Key.ToString(), item.Value);
}
con.Open();
result = cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception ex)
{
con.Close();
ShowMSG(ex.Message, "Error", "Error");
}
return result;
}
CREATE OR ALTER PROCEDURE [dbo].[Update_User]
@usr_ID int, --@user_id mandatory
@usr_Name nvarchar(50) = null, --default:: unknown
@usr_Username nvarchar(25) = null, --default::unknown
@usr_Password nvarchar(25) = null,
@usr_CNIC nvarchar(15) = null,
@usr_Phone nvarchar(13) = null,
@usr_Address nvarchar(100) = null,
@usr_DateTime datetime = null,
@usr_Role_FK int = null,
@usr_Status bit = null
AS
BEGIN
--check if all input params are null
if not exists
(
select @usr_Name, @usr_Username, @usr_Password, @usr_CNIC, @usr_Phone, @usr_Address, @usr_DateTime, @usr_Role_FK, @usr_Status
except
select null, null, null, null, null, null, null, null, null
)
begin
--no need for an update, everything is null
return;
end
--at least one param is not null, perform the update
UPDATE tbl_Users
SET usr_Name = isnull(@usr_Name, usr_Name),
usr_Username = isnull(@usr_Username, usr_Username),
usr_Password = isnull(@usr_Password, usr_Password),
usr_CNIC = @usr_CNIC,--same here, isnull...
usr_Phone = @usr_Phone,--same here....
usr_Address = @usr_Address,--same here...
usr_DateTime = @usr_DateTime,--same here...
usr_Role_FK = @usr_Role_FK, --same here...
usr_Status = isnull(@usr_Status, usr_Status)
WHERE usr_ID = @usr_ID;
END