更新查询中的“未更改”的SQLParameter

时间:2018-02-14 14:52:59

标签: c# sql-server

是否可以在更新查询中添加“未更改”参数。

在一些旧代码中,我有类似的东西:

string query = @"Update Table SET Field1=@var1, Field2=@var2, Field3=@var3 etc..."
command.Parameters.AddWithValue("@var1", var1);
command.Parameters.AddWithValue("@var2", var2);
command.Parameters.AddWithValue("@var3", var3);

现在有些东西改变了输入中的Field2 var2。如果用户没有提供var2,则Field2应保持不变。

有没有办法实现这样的目标

command.Parameters.AddWithValue("@var2", var2 ?? UNCHANGED);

如果没有提供var2,或者是唯一不添加SET Field2的选项吗?

3 个答案:

答案 0 :(得分:2)

将参数设置为可为空,并使用ISNULL。作为一个非常简单的例子:

CREATE PROC UpdateProc @ID int, @Column1 varchar(10) = NULL, @Column2 varchar(10) = NULL AS

    UPDATE YourTable
    SET Column1 = ISNULL(@Column1, Column1),
        Column2 = ISNULL(@Column2, Column2)
    WHERE ID = @ID;
GO

EXEC UpdateProc @ID = 1, @Column1 = 'Test';
--OR
EXEC UpdateProc @ID = 2, @Column1 = NULL, @Column2 = 'Test';

答案 1 :(得分:1)

在C#中你需要解决一些问题

此语法无效

cmd.Parameters.AddWithValue("@val1", var1 ?? DBNull.Value);

所以需要if else

string query = @"Update Table  
                 SET Field1 = isnull(@var1, Field1)   
                   , Field2 = isnull(@var2, Field2)";

if(var1 == null)
    cmd.Parameters.AddWithValue("@var1", DBNull.Value);
else
    cmd.Parameters.AddWithValue("@var1", var1);

就个人而言,如果我必须执行if else,那么我就不会将其包含在set中。

有人可能会有一个更流畅的解决方案。

答案 2 :(得分:0)

这样的事情可以解决问题。

protected string SetField(SqlCommand cmd, string field, string paramName, object value)
{
    if (value == null)
        return null;

    cmd.Parameters.AddWithValue(paramName, value);

    return string.Format("{0}={1}", field, paramName);
}

并使用它

string query = @"Update Table SET ";

IEnumerable<string> assignments = new string[]
{
    SetField(command, "Field1", "@var1", var1),
    SetField(command, "Field2", "@var2", var2),
    SetField(command, "Field3", "@var3", var3),
};

assignments = assignments.Where(s => s != null).ToList();

if (!assignments.Any())
    return;              // no update needed

query += string.Join(",", assignments);