Sql обновить команду с дополнительными параметрами? - PullRequest
3 голосов
/ 25 января 2012

Я вставляю около 500 000 объектов в базу данных, где многие из них одинаковы (имеют одинаковое представление первичного ключа в базе данных), но другие поля могут отличаться, поэтому я использую подход «обновить - если строки не затронуты - вставить» , Проблема заключается в том, что иногда объект имеет какое-либо поле с нулевым значением (не читается из файла) и уже находится в базе данных с некоторым установленным значением, поэтому я обновляю его до нулевого = стираю его. Как реализовать сценарий, чтобы вы обновляли только поля которые не равны нулю?

Вот простой пример того, как я делаю это сейчас:

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 ]

2 голосов
/ 25 января 2012

Изменить обновление на:

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
0 голосов
/ 25 января 2012

Не обновляйте базу данных только для проверки, существует ли строка

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

, и просто проверяйте, больше ли возвращаемое значение, чем 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...