我正在向数据库中插入大约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; } }
将更新更改为:
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