【发布时间】:2012-01-24 23:19:32
【问题描述】:
我将大约 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;
}
}
【问题讨论】:
-
某些 SQL 产品具有您用一条语句描述的功能:
INSERT ... IF DUPLICATE UPDATE ... -
@ypercube 因为它是
SqlCommand它的 SQL Server。那么只要 2005 年或更大,它就会被 MERGE -
是的,我不是很喜欢 sql,但我认为它应该具有该功能 :) 我使用 Sql server 2008,express edition,我将查找 MERGE 语法,谢谢