Я вставляю около 500 000 объектов в базу данных, где многие из них одинаковы (имеют одно и то же представление первичного ключа в базе данных), но другие поля могут быть разными, поэтому я использую подход «update» - если никакие строки не пострадали - вставьте ». Проблема в том, что иногда у объекта есть какое-то поле, установленное в null (нечитаемое из файла) и уже находится в базе данных с некоторым значением, поэтому я обновляю его до null = удаляет его.) Как реализовать сценарий, который вы бы обновили только по полям которые не являются нулевыми?Команда обновления Sql с дополнительными параметрами?
Вот простой пример того, как я делаю это сейчас:
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 ... Если DUPLICATE UPDATE ...' –
@ypercube с момента его а 'SqlCommand' - его SQL Server. Тогда это будет MERGE до тех пор, пока он не достигнет 2005 года или выше –
Да, я не совсем в sql, но я бы предположил, что он должен иметь такую функциональность :) Я использую Sql server 2008, express edition, я буду искать синтаксис MERGE, спасибо – MSkuta