是否可以在更新查询中添加“未更改”参数。
在一些旧代码中,我有类似的东西:
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的选项吗?
答案 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);