Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有多个参数但可以插入所需参数的存储过程_Sql Server - Fatal编程技术网

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

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_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