我向数据库中插入了大约500 000个对象,其中许多对象相同(在数据库中具有相同的主键表示形式),但其他字段可能不同,所以我使用的方法是“更新 - 如果没有行受影响 - 插入”。问题是,有时一个对象有一些字段设置为null(从文件中不可读),并且已经在数据库中设置了一些值,因此我将它更新为null =擦除它。)如何实现场景,只更新字段那不是null?带有可选参数的Sql update命令?
这里是我怎么做,现在一个简单的例子:
private const string UpdateKun = "UPDATE pde.Kun SET [email protected] WHERE [email protected]";
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;
}
}
一些SQL产品具有的功能你用一个语句描述:'INSERT ... IF DUPLICATE UPDATE ...'因为它是一个 –
@ypercube 'SqlCommand'它的SQL Server。那么它会合并,只要它2005年或更大 –
是啊我没有真正进入SQL,但我会认为它应该有这样的功能:)我使用Sql server 2008,express版,我会查找MERGE语法,谢谢 – MSkuta