带有可选参数的sql update命令?

时间:2012-01-24 23:19:33

标签: c# sql

我将大约500,000个对象插入到数据库中,其中许多对象是相同的(在数据库中具有相同的主键表示),但其他字段可能不同,因此我使用方法“更新 - 如果没有行影响 - 插入” 。问题是有时一个对象将某个字段设置为null(从文件中不可读)并且已经在数据库中设置了一些值,因此我将其更新为null =擦除它。)如何实现方案,您只更新字段那不是空的吗?

以下是我现在正在做的一个简单示例:

private const string UpdateKun = "UPDATE pde.Kun SET Jmeno=@Jmeno WHERE Licence=@Licence";
private const string InsertKun = "INSERT INTO pde.Kun ([Licence], [Jmeno], [VykonnostniStupen]) VALUES (@Licence, @Jmeno, @VykonnostniStupen)";

var cmd = new SqlCommand(UpdateKun, conn, tran);
cmd.Parameters.AddWithValue("@Licence", kun.Licence);
cmd.Parameters.AddWithValue("@Jmeno", kun.Jmeno);
RepairNulls(cmd.Parameters);
if (cmd.ExecuteNonQuery() > 0) return;

cmd = new SqlCommand(InsertKun, conn, tran);
cmd.Parameters.AddWithValue("@Licence", kun.Licence);
cmd.Parameters.AddWithValue("@Jmeno", kun.Jmeno);
cmd.Parameters.AddWithValue("@VykonnostniStupen", 0);
RepairNulls(cmd.Parameters);
cmd.ExecuteNonQuery();


private void RepairNulls(SqlParameterCollection col)
    {
        foreach (SqlParameter param in col.Cast<SqlParameter>().Where(param =>  param.Value == null))
        {
            param.Value = DBNull.Value;
        }
    }

2 个答案:

答案 0 :(得分:2)

将更新更改为:

UPDATE pde.Kun 
SET Jmeno=@Jmeno 
WHERE Licence=@Licence
  AND @Jmeno IS NOT NULL

如果您要更新多个列:

UPDATE pde.Kun 
SET Jmeno = COALESCE(@Jmeno, Jmeno)
  , ColumnB = COALESCE(@ColumnB, ColumnB) 
WHERE Licence=@Licence

答案 1 :(得分:0)

不要仅仅为了检查行是否存在而更新数据库

SELECT COUNT(*) FROM pde.Kun WHERE Licence=@Licence

并检查返回的值是否大于0